Binding JAXB  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
nandobgi
Java Ninja
[Avatar]

Membro desde: 27/03/2006 07:27:06
Mensagens: 280
Localização: Birigui-SP
Offline

Pessoal estou utilizando JAXB para montar meus arquivos xml, baixei o plugin do eclipse para gerar as classes com base nos schemas, o arquivo montado é uma nota fiscal eletrônica, estou tendo problemas no namespace do xml.

Arquivo Gerado


Mas a forma correta seria assim


Estou gerando meu arquivo da seguinte forma.



Alguém ja passou por isso e poderia me ajudar por favor

Grato




[MSN]
mateusprado
JavaEvangelist
[Avatar]

Membro desde: 26/02/2008 07:20:38
Mensagens: 412
Localização: Araraquara, SP
Offline

Ola Fernando, qual e' o erro, ou mensagem que esta lhe retornando ?

Mateus Prado


Caelum Stella

SCJP - Sun Certified Java Programmer
SCWCD - Sun Certified Web Component Developer
[WWW] [MSN]
nandobgi
Java Ninja
[Avatar]

Membro desde: 27/03/2006 07:27:06
Mensagens: 280
Localização: Birigui-SP
Offline

Ola Mateus tudo bem?

Quando tento transmitir o arquivo ou vou valida-lo é retornado um erro de que o cabeçalho está incorreto.
O arquivo gerado por mim parece estar incorreto na declaração dos namespaces.

Grato



[MSN]
roassunca
Thread.start()
[Avatar]

Membro desde: 10/03/2005 11:54:46
Mensagens: 28
Offline

Fernando, qual plugin do Eclipse vc tah usando?
[WWW] [MSN] [ICQ]
isaiasa
Entusiasta Java

Membro desde: 28/06/2007 17:15:37
Mensagens: 15
Offline

Não há nada de errado com plugins dele, o problema é que o JAXB é bom demais.

Deixa eu explicar:

Assim como o eclipse, outras ferramentas não funcionam com o NS2, vai falar para eles que não esta errado e que o JAXB só quiz fazer da maneira certa?

Pois é.. Não consegui fazer ele parar de gerar o ns2 assim como o amigo descreveu no post, então foi obrigado à atacar para a apelação, pois a definição de namespace no jaxb é simples..

@XmlRootElement(name="urlset",namespace="http://www.sitemaps.org/schemas/sitemap/0.9")
@XmlAccessorType(XmlAccessType.FIELD)

Porém SEMPRE ele gera com o maldito ns2 e as ferramentas que vão ler "quase" sempre se batem por causa dele.

Não tenho nada contra o jaxb, pelo contrário, ele me ajuda MUITO, porém ajuda tanto e faz as coisas tão certo que acaba atrapalhando quando quem vai ler do outro lado não o faz.

Por isso eu escrevi um artigo no meu blog com a solução para o problema:

SEQUE O LINK:
http://www.informativogeral.com.br/?post=JAXB-E-O-MALDITO-NS2

DIGO E REPITO: Não é a melhor solução, mas resolve o problema na hora e você não priva-se de usar os benefícios do JAXB, já que ele só é acionado como forma de AJUSTE do xml depois do parse:

Abraços

This message was edited 1 time. Last update was at 19/02/2009 10:00:02

andrefariagomes
JavaBaby
[Avatar]

Membro desde: 18/09/2004 11:10:06
Mensagens: 90
Offline

Olá Pessoal,

Estou tendo problemas para gerar os beans da Nota Fiscal Eletronica com JAXB, parece que um XSD faz include do outro e dá pau...
Vocês consguiram fazer funcionar numa boa?

O comando que tentei usar é o seguinte:
xjc -d ../../java/ cabecMsg_v1.02.xsd enviNFe_v1.10.xsd retEnviNFe_v1.10.xsd consReciNFe_v1.10.xsd retConsReciNFe_v1.10.xsd cancNFe_v1.07.xsd retCancNFe_v1.07.xsd consSitNFe_v1.07.xsd retConsSitNFe_v1.07.xsd consStatServ_v1.07.xsd retConsStatServ_v1.07.xsd consCad_v1.01.xsd leiauteConsultaCadastro_v1.01.xsd -h

Abraço

Abraço,
André Faria
[Email] [WWW] [Yahoo!] [MSN]
alves.Felipe
Virtual Machine Man
[Avatar]

Membro desde: 21/01/2008 13:45:56
Mensagens: 737
Localização: Curitiba - Pr
Offline

andrefariagomes wrote:Olá Pessoal,

Estou tendo problemas para gerar os beans da Nota Fiscal Eletronica com JAXB, parece que um XSD faz include do outro e dá pau...
Vocês consguiram fazer funcionar numa boa?

O comando que tentei usar é o seguinte:
xjc -d ../../java/ cabecMsg_v1.02.xsd enviNFe_v1.10.xsd retEnviNFe_v1.10.xsd consReciNFe_v1.10.xsd retConsReciNFe_v1.10.xsd cancNFe_v1.07.xsd retCancNFe_v1.07.xsd consSitNFe_v1.07.xsd retConsSitNFe_v1.07.xsd consStatServ_v1.07.xsd retConsStatServ_v1.07.xsd consCad_v1.01.xsd leiauteConsultaCadastro_v1.01.xsd -h

Abraço


pra quem tiver a mesma dúvida...

http://www.technopub.com.br/index.php?page=artigos&id=10

Felipe Alves
[Email]
carlos.scuna
Debugger
[Avatar]

Membro desde: 06/08/2006 23:29:57
Mensagens: 53
Offline

isaiasa wrote:Não há nada de errado com plugins dele, o problema é que o JAXB é bom demais.

Deixa eu explicar:

Assim como o eclipse, outras ferramentas não funcionam com o NS2, vai falar para eles que não esta errado e que o JAXB só quiz fazer da maneira certa?

Pois é.. Não consegui fazer ele parar de gerar o ns2 assim como o amigo descreveu no post, então foi obrigado à atacar para a apelação, pois a definição de namespace no jaxb é simples..

@XmlRootElement(name="urlset",namespace="http://www.sitemaps.org/schemas/sitemap/0.9")
@XmlAccessorType(XmlAccessType.FIELD)

Porém SEMPRE ele gera com o maldito ns2 e as ferramentas que vão ler "quase" sempre se batem por causa dele.

Não tenho nada contra o jaxb, pelo contrário, ele me ajuda MUITO, porém ajuda tanto e faz as coisas tão certo que acaba atrapalhando quando quem vai ler do outro lado não o faz.

Por isso eu escrevi um artigo no meu blog com a solução para o problema:

SEQUE O LINK:
http://www.informativogeral.com.br/?post=JAXB-E-O-MALDITO-NS2

DIGO E REPITO: Não é a melhor solução, mas resolve o problema na hora e você não priva-se de usar os benefícios do JAXB, já que ele só é acionado como forma de AJUSTE do xml depois do parse:

Abraços



Li o artigo acima, e gostaria de saber aí se a galera não descobriu uma maneira melhor de resolver isso.

Estou começando agora um projeto com NFe e já acabei de topar com esse mesmo problema do JAX-B. Vi que esse artigo tem mais de 1 ano já, então a pergunta é: já conseguiu uma outra forma menos "gambiarroza" de resolver isso? Eu vi que acertando os elementos dos beans gerados pelo JAXB ele vai mudando a forma de como utiliza os prefixos, mas não cheguei a um consenso a respeito.

Se descobriram outra forma, por favor, postem aí como funcionado.


Obrigado
isaiasa
Entusiasta Java

Membro desde: 28/06/2007 17:15:37
Mensagens: 15
Offline

SIm, há solução de personalizar os namespaces, no link:

http://blogs.sun.com/enterprisetechtips/entry/customizing_jaxb

Você encontra a solução.


Você precisa criar uma classe que estenda NamespacePrefixMapper vide:



Depois no seu marshaller voce seta:



Abraço

gr_marco
JavaChild

Membro desde: 13/05/2005 11:39:03
Mensagens: 142
Localização: Curitiba
Offline

Mesmo assim... se eu mando retornar "", ele tenta colocar o default, que no caso é aquele ns2 indesejado...
Falta implementar mais alguma coisa???
isaiasa
Entusiasta Java

Membro desde: 28/06/2007 17:15:37
Mensagens: 15
Offline

Quais das opções abaixo resolvem teu problema?

- Gerar o xml sem nenhum namespace? S: Não anote nenhum nameSpace no seu bean que foi anotado para trabalhar com JAXB.

- Gerar o xml com 1 único namespace? S: se for isso, veja exemplo abaixo.


Implementação:


This message was edited 1 time. Last update was at 13/04/2010 09:43:19

carlos.scuna
Debugger
[Avatar]

Membro desde: 06/08/2006 23:29:57
Mensagens: 53
Offline

isaiasa wrote:Quais das opções abaixo resolvem teu problema?

- Gerar o xml sem nenhum namespace? S: Não anote nenhum nameSpace no seu bean que foi anotado para trabalhar com JAXB.

- Gerar o xml com 1 único namespace? S: se for isso, veja exemplo abaixo.


Implementação:




Na verdade nenhum dos dois. O problema meu, que é o mesmo do Marco, é que o JAXB parece não permitir a utilização de tags não prefixadas para namespaces diferentes. Por exemplo, o seguinte XML nunca poderia ser marshallizado através do JAXB:





O que o JAXB faria no caso de tentar marshallizar os beans correspondentes ao XML acima é:







Enfim... teria alguma maneira de fazer com que o JAXB marshalize para o primeiro XML ???

Já tentei com todas as formas do NamespacePrefixMapper, utilizando todos os métodos ali, e nada até agora.
A solução até o momento é porcamente remover os prefixos com replace(...). Porca mesmo!!!


Obrigado
isaiasa
Entusiasta Java

Membro desde: 28/06/2007 17:15:37
Mensagens: 15
Offline

Carlos

Teu caso é diferente do caso que passei.

Mas tenho um teste para propor:

Baseando-se no exemplo abaixo, que é nosso alvo:




Tu poderias tentar colocar o conteudo de subTag4 em uma outra classe anotada com o namespace http://www.example2.org unicamente e depois acrescer esse xml após o marshall à o seu conteudo da seguinte forma:




e depois montar o xml:



Eu não consegui testar essa solução, por isso é uma sugestão, vou ver se consigo fazer o mesmo teste quando eu chegar em casa, estou meio enrolado aqui no serviço agora. Mas ACREDITO que deva resolver, porque note que os marshall's são feitos de forma separada, se isso é uma deficiencia mesmo do JAXB, após o marshall a "CACA" ja foi feita e nós sabemos que esses problemas só ocorrem quando temos mais de 1 ns... no caso será 1 para cada documento.

Continuo em alerta para tentarmos resolver o problema e termos uma solução mais limpa.

Abraço
aix
Virtual Machine Man
[Avatar]

Membro desde: 16/09/2007 08:31:00
Mensagens: 549
Online

Pessoal nada ainda ? para a solução deste problema ?

estou trabalahndo nisto, se alguem ja resolveu ou tem a solução, por favor compartilhe.

This message was edited 1 time. Last update was at 06/03/2011 20:06:47


A estrada do excesso leva ao palácio da sabedoria.
[MSN]
aix
Virtual Machine Man
[Avatar]

Membro desde: 16/09/2007 08:31:00
Mensagens: 549
Online

Ola Isaiasa,

vi seu post sobre os prefixos nas namespace da NF-e, vi que se vc manter as classes(objetos que representão o xml de consumo do serviço) ex: ConsStatServ.java estar no pacote br.inf.portalfiscal.nfe.wsdl.nfestatusservico2\ vc não tera esses prefixos gerados.

Notei que isso traz problemas quando vc limpa e controi a aplicação gerando os stubs novamente vc perdia a alteração que vc havia feito nas classes:

1- a configuração na classe ObjectFactory gerada pelo Cliente WS(public ConsStatServ createConstatSet()),
2 - uma anotação na NfeCabecMsg()(classe tambem gerada pelo cliente ws)

ex:


se eu não der clean and build tudo blz, pois posso apenas constuir sem limpar, assim não perco o que fiz.

agora pergunto, tem alguma maneira melhor de fazer isto ? para que eu possa usar o gerador do cliente e configura-lo a ponto de não precisar fazer essas alterações manualmente ? ex: para podermos gerar os stubs de maneira correta com o método de consumo do serviço aceitando 2 parametros(nfeCabecMsg e NfeDadosMsg) temos que "editar atributos do serviço web" para colocar a linha XadditionalHeaders para true, após atualizado a referencia do serviço web ou limpado e construindo ele gera tudo novamente, de maneira correta.



A estrada do excesso leva ao palácio da sabedoria.
[MSN]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team