Tranformar XML em Objeto, JAXB

7 respostas
D

erro no parse se XML para objeto, com JAXB.

[org.xml.sax.SAXParseException: The prefix "v1" for element "v1:fiscalScenarioSummary" is not bound.] at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(Unknown Source)

7 Respostas

A

A questão não é o “v1” (que, neste caso, é chamado de “prefixo”). A questão é que esse v1 se refere a um namespace que, provavelmente, não está mapeado no seu objeto FiscalScenarioSummary. Você pode postar este objeto e o XML completo, para que eu possa checar o mapeamento?

[]'s

D

Correto, é namespace e não prefixo, analisando o envelope SOAP, teria ainda que criar o objeto sendTaxParameters para encapsular o FiscalScenarioSummary, antes da transformação, seguem os arquivos.

//imports omitidos
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "FiscalScenarioSummary", propOrder = {
        "product",
        "originState",
        "destinationState",
        "taxableOperation",
        "goodsSource",
        "originSector",
        "destinationSector",
        "taxRulesFrom",
        "taxRulesTo",
        "specialMeasuresFrom",
        "specialMeasuresTo",
        "cfop"
})
@XmlRootElement
public class FiscalScenarioSummary {

    protected List<Product> product;
    protected String originState;
    protected String destinationState;
    protected Integer taxableOperation;
    protected Integer goodsSource;
    protected Integer originSector;
    protected Integer destinationSector;
    protected String taxRulesFrom;
    protected String taxRulesTo;
    protected Integer specialMeasuresFrom;
    protected Integer specialMeasuresTo;
    @XmlElement(name = "CFOP")
    protected Integer cfop;
//getteres e setters
..

o envelope soap é este:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.application.server.messaging.fiscalapp.ciss.com.br/" xmlns:v1="http://canonical.ciss.com.br/financials/v1" xmlns:cli="http://integration.ciss.com.br/sync/client"> <soapenv:Header/> <soapenv:Body> <v1:sendTaxParameters> <v1:fiscalScenarioSummary> <v1:cfop>5102</v1:cfop> <v1:destinationState/> <v1:goodsSource/> <v1:originSector/> <v1:taxableOperation/> <v1:originState/> <v1:taxRulesFrom/> <v1:taxRulesTo/> <v1:specialMeasuresFrom/> <v1:specialMeasuresTo/> <v1:product> <v1:internalCode>454455</v1:internalCode> <v1:subInternalCode>454455</v1:subInternalCode> <v1:barCode>7891141018572</v1:barCode> <v1:ncm>33051000</v1:ncm> <v1:icms> <m:cst>00</m:cst> <m:taxRate>17.00</m:taxRate> <m:commencementDate>2002-12-01-02:00</m:commencementDate> <m:expiryDate>2999-12-31-02:00</m:expiryDate> <m:legalProvision>Art. 63, I e §1º do RICMS/ES . Art. 71, I, "a" do RICMS/ES</m:legalProvision> <m:observations>Inexistente</m:observations> <m:additionalInformation>Inexistente</m:additionalInformation> </v1:icms> </v1:product> </v1:fiscalScenarioSummary> </v1:sendTaxParameters> </soapenv:Body>

A

Neste caso, basta alterar o código para ficar assim:

...


@XmlRootElement(namespace="http://canonical.ciss.com.br/financials/v1")
public class FiscalScenarioSummary {

...

Talvez também seja necessário alterar mais alguma coisa no método sendTaxParameters, mas acredito que você entendeu a idéia :wink:

[]'s

D

ocorreu o mesmo erro!
Fiz o inverso, criei um objeto manualmente, e ao invés de transformar o XML em Object, transformei o Object em XML, e o XML ficou assim, teria alguma tag para nomear este namespace de ns2 para v1, e os atributos assumirem este tipo, ou será que tenho que incluir uma anotação para cada atributo, dizendo que seu namespace é v1?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns2:FiscalScenarioSummary xmlns:ns2="http://canonical.ciss.com.br/financials/v1"> <product> <barCode>431241234</barCode> </product> <originState>SC</originState> <destinationState>PR</destinationState> <goodsSource>3</goodsSource> <originSector>4</originSector> <destinationSector>2</destinationSector> <specialMeasuresFrom>5</specialMeasuresFrom> <specialMeasuresTo>6</specialMeasuresTo> <CFOP>123</CFOP> </ns2:FiscalScenarioSummary>

D

Funcionou :D

adicionei o arquivo package-info.java da maneira abaixo.

@XmlSchema( namespace = "http://canonical.ciss.com.br/financials/v1",
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
xmlns = { @XmlNs(namespaceURI = "http://canonical.ciss.com.br/financials/v1", prefix = "v1"),
})

package jaxbe.objetos;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlSchema;

mas não ficou muito claro por que, pois ao gerar o XML a aprtir do objeto, o prefixo namespace mantém ns2.

D

não funcionou não!!!
sem querer sobreescrevi o arquivo XML que causa erro com o XML transformado a partir do objeto!!!

A

Você pode fazer o seguinte… se você tiver os schemas, tente fazer o processo inverso, ou seja, gerar os objetos a partir deles. Para isso, basta utilizar o xjc - um utilitário que vem com a JDK.

[]'s

Criado 17 de abril de 2013
Ultima resposta 17 de abr. de 2013
Respostas 7
Participantes 2