JAXB E O MALDITO NS2
08/04/2010
Se você precisou atribuir um namespace a um xml sendo que o marshall precisa ser feito sem declaração de 'xmlns:ns2' não tem santo que faça o JAXB remover isso, andei pesquisando bastante e devido à pressa para solucionar o problema achei 2 soluções que não são as melhores, porém resolvem o problema.
1: Remover o nodo do XML ns2 no parse:
# NodeList elements = doc.getElementsByTagName('infNFe');
# Element el = (Element) elements.item(i);
# String id = el.getAttribute('Id');
# // aqui ocorre a remoção do atributo...
# doc.getDocumentElement().removeAttribute('xmlns:ns2');
# ((Element)
# doc.getDocumentElement().getElementsByTagName('NFe').item(0))
# .setAttribute('xmlns', 'http://www.portalfiscal.inf.br/nfe');
#
# Create a DOM XMLSignatureFactory that will be used to
# generate the enveloped signature.
#
# Reference ref = fac.newReference('#' + id, fac.newDigestMethod(
# DigestMethod.SHA1, null), transformList, null, null);
Um exemplo completo do código em:
http://www.guj.com.br/posts/list/83758.java
Aqui uma gambiarra que foi usada até que se resolvesse da maneira acima:
// passa-se o file a ser re-formatado como string
public void ajustaXml(File file) throws Exception {
FileReader reader = new FileReader(file);
BufferedReader leitor = new BufferedReader(reader);
leitor.read();
String vlr = '';
StringBuffer vlrFile = new StringBuffer();
String line = leitor.readLine();
while(line != null) {
vlrFile.append( line );
line = leitor.readLine();
}
vlr = vlrFile.toString();
if (vlr.indexOf('ns2:') > -1) {
vlr = vlr.replaceAll('ns2:', '');
}
if (vlr.indexOf(':ns2') > -1) {
vlr = vlr.replaceAll(':ns2', '');
}
leitor.close();
reader.close();
FileWriter writer = new FileWriter(file);
PrintWriter saida = new PrintWriter(writer);
saida.print( '<' + vlr);
writer.close();
saida.close();
}
Ambas maneiras acima resolvem o problema do ns2, e servem para remover o ns2 do jaxb, se alguem tiver uma solução melhor favor comentar.
Assim que eu resolver de forma correta esse problema postarei aqui a resposta.
Abraço
Conforme prometido.. segue solução abaixo:
SOLUÇÃO CORRETA, SEM GAMBIARRAS (Setando um name space preferido) :
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:
[code]NamespacePrefixMapper m = new PreferredMapper();
marshal(jc, e, m);
public static class PreferredMapper extends NamespacePrefixMapper {
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
return 'mappedNamespace' + namespaceUri;
}
}[/code]
Depois no seu marshaller voce seta:
[code]final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, 'UTF-8');
marshaller.setProperty('com.sun.xml.internal.bind.namespacePrefixMapper',
new NamespacePrefixMapperImpl('http://www.isotc211.org/2005/gmd'));[/code]
Abraço
Topo   Link para este post Comentários
Redação Ige. ( redacao@informativogeral.com.br )
VOTE NO AMARELINHO PARA O TOP BLOG 2010




