JAXB + Marshall + E-Financeira

6 respostas Resolvido
java
J

Olá pessoal, tudo bem?

Estou tendo dificuldades técnicas para poder continuar o desenvolvimento do meu projeto, será que podem me ajudar?

Bom, estou fazendo o E-Financeira, que é uma integração das empresas de previdência privada com a receita federal, e como desenvolvo em um sistema para previdência estou tendo que faze-lo.

Estou usando Java 8, e a IDE é o Intellij Idea.

Já importei o arquivo “.xsd” e também o “wsdl”.

Estou tentando popular os dados que deverão compôr o xml que deverá ser enviado, mas não estou conseguindo.

Eis os códigos:

Essa é a classe “principal” do E-Financeira, que será o root do XML (essa veio importada pelo XSD).

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "loteEventos"
})
@XmlRootElement(name = "eFinanceira", namespace = "http://www.eFinanceira.gov.br/schemas/envioLoteEventos/v1_0_1")
public class EFinanceira {

    @XmlElement(namespace = "http://www.eFinanceira.gov.br/schemas/envioLoteEventos/v1_0_1", required = true)
    protected EFinanceira.LoteEventos loteEventos;

    public EFinanceira.LoteEventos getLoteEventos() {
        return loteEventos;
    }

    public void setLoteEventos(EFinanceira.LoteEventos value) {
        this.loteEventos = value;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "evento"
    })
    public static class LoteEventos {

        @XmlElement(namespace = "http://www.eFinanceira.gov.br/schemas/envioLoteEventos/v1_0_1", required = true)
        protected List<TArquivoeFinanceira> evento;

        public List<TArquivoeFinanceira> getEvento() {
            if (evento == null) {
                evento = new ArrayList<TArquivoeFinanceira>();
            }
            return this.evento;
        }
    }
}

Essa é a classe com o tipo do atributo que o XSD espera (essa classe veio importada pelo XSD).

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TArquivoeFinanceira", namespace = "http://www.eFinanceira.gov.br/schemas/envioLoteEventos/v1_0_1", propOrder = {
    "any"
})
public class TArquivoeFinanceira {

    @XmlAnyElement
    protected Element any;
    @XmlAttribute(name = "id", required = true)
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlID
    @XmlSchemaType(name = "ID")
    protected String id;

    public Element getAny() {
        return any;
    }

    public void setAny(Element value) {
        this.any = value;
    }

    public String getId() {
        return id;
    }

    public void setId(String value) {
        this.id = value;
    }
}

Esse é o ObjectFactory que veio importado pelo XSD também

@XmlRegistry
public class ObjectFactory {

    public ObjectFactory() {
    }

    public EFinanceira createEFinanceira() {
        return new EFinanceira();
    }

    public EFinanceira.LoteEventos createEFinanceiraLoteEventos() {
        return new EFinanceira.LoteEventos();
    }

    public TArquivoeFinanceira createTArquivoeFinanceira() {
        return new TArquivoeFinanceira();
    }
}

Aqui está uma classe que eu criei pra testar a inserção dos campos no XML

@XmlRootElement(namespace = "http://www.eFinanceira.gov.br/schemas/aberturaLote/v1_0_1")
public class TesteModaFoca extends SuperTesteModaFoca{
    protected String xamame;

    @XmlElement(namespace = "http://www.eFinanceira.gov.br/schemas/aberturaLote/v1_0_1", required = true)
    public String getXamame() {
        return xamame;
    }

    public void setXamame(String xamame) {
        this.xamame = xamame;
    }
}
E a superclasse dessa classe:

public class SuperTesteModaFoca implements org.w3c.dom.Element {

//@métodos sobrescritos

}

E aqui está o meu teste:

public static void main(String[] args) {
        try {
            ObjectFactory objFactory = new ObjectFactory();
            EFinanceira eFinanceira = objFactory.createEFinanceira();

            TesteModaFoca teste = new TesteModaFoca();
            teste.setXamame("aaaahh muleeeeke");

            TArquivoeFinanceira tArquivoeFinanceira1 = objFactory.createTArquivoeFinanceira();
            tArquivoeFinanceira1.setAny(teste);
            tArquivoeFinanceira1.setId("ID1");

            TArquivoeFinanceira tArquivoeFinanceira2 = objFactory.createTArquivoeFinanceira();
            tArquivoeFinanceira2.setAny(teste);
            tArquivoeFinanceira2.setId("ID2");

            EFinanceira.LoteEventos lote = objFactory.createEFinanceiraLoteEventos();
            List<TArquivoeFinanceira> lista = lote.getEvento();
            lista.add(tArquivoeFinanceira1);
            lista.add(tArquivoeFinanceira2);

            eFinanceira.setLoteEventos(lote);

            JAXBContext jaxbContext = JAXBContext.newInstance(eFinanceira.getClass());
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(eFinanceira, System.out);
        }
        catch (JAXBException e) {
            e.printStackTrace();
        }
    }

E está me retornando o sequinte XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<eFinanceira xmlns="http://www.eFinanceira.gov.br/schemas/envioLoteEventos/v1_0_1">
    <loteEventos>
        <evento id="ID1"/>
        <evento id="ID2"/>
    </loteEventos>
</eFinanceira>

Mas quero fazer inserir os elementos “xamame” da classe TesteModaFoca no elemento

Teria que ficar mais ou menos assim:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<eFinanceira xmlns="http://www.eFinanceira.gov.br/schemas/envioLoteEventos/v1_0_1">
    <loteEventos>
        <evento id="ID1">
           <xamame>aaaahh muleeeeke</xamame>
        </evento>
        <evento id="ID2">
           <xamame>aaaahh muleeeeke</xamame>
        </evento>
    </loteEventos>
</eFinanceira>

ALGUMA IDEIAAA?? por favor :sweat_smile: :sob:

6 Respostas

J
Solucao aceita

Galera, mandei o link aqui do post pra uns amigos e me ajudaram pessoalmente e consegui resolver o problema.

Créditos pro amigo Diogo Giassi, que trabalha na NeoWay, segue solução:

Quando a classe veio importada pelo arquivo “xsd” a IDE importou o Element do tipo errado.
O correto é o tipo “javax.xml.bind.Element”, e a importação trouxe como “org.w3c.dom.Element”.
Além disso, foi feito a alteração no seguinte trecho de código:

JAXBContext jaxbContext = JAXBContext.newInstance(eFinanceira.getClass(), tArquivoeFinanceira1.getClass(), teste.getClass());

e agora funcionando:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<eFinanceira xmlns="http://www.eFinanceira.gov.br/schemas/envioLoteEventos/v1_0_1" xmlns:ns2="http://www.eFinanceira.gov.br/schemas/aberturaLote/v1_0_1">
    <loteEventos>
        <evento id="ID1">
            <ns2:testeModaFoca>
                <ns2:xamame>aaaahh muleeeeke</ns2:xamame>
            </ns2:testeModaFoca>
        </evento>
        <evento id="ID2">
            <ns2:testeModaFoca>
                <ns2:xamame>aaaahh muleeeeke</ns2:xamame>
            </ns2:testeModaFoca>
        </evento>
    </loteEventos>
</eFinanceira>

Ainda vou ter que fazer alguns ajustes, mas esse problema que era o principal já foi solucionado.

T

Olá João, aqui na empresa só agora iniciamos o desenvolvimento do sistema e-financeira.

Você conseguiu enviar o documento para o sped?
Também estamos com algumas dificuldades para assinar o xml utilizando o SHA-2 que mudou recentemente.

Você teria alguma dica para implementar essas funcionalidade?

J

Thiago, agora que estou começando a fazer a assinatura, então também não sei te responder ainda.

A hora que tiver alguma novidade eu posto aqui, e caso vocês tenham também e quiserem compartilhar, fiquem a vontade.

T

Olá João, estou também com problemas no envio do lote para a receita via WebService. Você teria alguma dica para implementar? O problema está na autenticação do WebService com o certificado digital, estou usando o A3 token.

M

Qual teu e-mail do gmail thiago?

T

[email removido] ou [email removido]

Criado 9 de março de 2016
Ultima resposta 2 de mai. de 2016
Respostas 6
Participantes 3