Setar namespace no xml com JAXB [RESOLVIDO]

13 respostas
wender.jean

E ae galera,

Estou com um grande problema aqui que é adicionar um namespace no xmlns gerado com JAXB.

Meu código esta gerando a seguinte informação:

<mensagemTiss xmlns="http://www.ans.gov.br/padroes/tiss/schemas">

E eu preciso que ele gere da seguinte forma:

<ansTISS:mensagemTiss xmlns:ansTISS="http://www.ans.gov.br/padroes/tiss/schemas">

Pois todas as tags do meu xml precisam dessa nomenclatura “ansTISS”.

Já tentei setar na classe root mas ai ele gera assim, xmlns:ns2.

Alguém ai já passou por isso?

Grato!

13 Respostas

ViniGodoy

Movido para o fórum de Java Avançado.

orogerio

Olá Wender !! Já passei por isso. Segue o caminho:

1- Crie a seguinte classe extendendo NamespacePrefixMapper.

import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

/**
 *
 * @author rogério cruz sousa
 */
public class ANSPrefixMapper extends NamespacePrefixMapper {

    public static final String PREFIXO_ANS = "ansTISS";
    
    @Override
    public String getPreferredPrefix(String arg0, String arg1, boolean arg2) {
        return PREFIXO_ANS;
    }
    
}
  1. Coloque esse código quando for fazer a conversão usando o JAXB
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new ANSPrefixMapper());

Até mais
Rogério

wender.jean

Rogerio,

Implementei como indicou mas esta dando a seguinte exceção:

Exception in thread "main" javax.xml.bind.PropertyException: name: com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper value: tttr.AnsPrefixMapper@61542a75
        at javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:338)
        at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:532)
        at tttr.Main.main(Main.java:69)
Java Result: 1

A unica coisa que modifiquei aqui foi o import que coloquei:

Dai modifiquei na classe ANSPrefixMapper e na instrução setProperty do marshaller.

marshaller.setProperty("com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper", new AnsPrefixMapper());

Grato!

orogerio

Já faz uns três anos q eu fiz esse código, no meu import está?

import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

Se ajudar, segue o resto do cabeçalho:

JAXBContext jaxbContext;                
        jaxbContext = JAXBContext.newInstance("br.gov.ans.padroes.tiss.schemas.v20103");
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new ANSPrefixMapper());
        marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.TRUE);
        marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, schemaPath);
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

Até mais

wender.jean

Rogerio,

Valeu cara, foi isso mesmo. Só não estava funcionando no meu projeto teste, passei pro projeto original que é web e funcionou perfeitamente.

:smiley:

viniciuspadua

pode postar o resultado final ?

wender.jean

Tu quer o código completo?

viniciuspadua

pode ser! manda os import tb

viniciuspadua

resolvi aqui!

ThiagoInGuj

Sei que está resolvido, mas eu implementei de uma forma mais simples.

Para um namespaces no seu xml, crie o arquivo package-info.java dentro do package onde está a sua classe JAXB e cole o conteúdo abaixo:

@javax.xml.bind.annotation.XmlSchema(namespace = “seunamespace”, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package seupackage;

Só isso. Isso automaticamente inserirá o namespace no seu xml:

R

Ola…Boa Tarde…

se alguem conseguiu fazer isso funcionar… por favor me ajude…

aqui apresenta o seguinte erro:

Exception in thread "main" javax.xml.bind.PropertyException: name: br.gov.ans.padroes.tiss.schemas value: app.ANSPrefixMapper@1191056
	at javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:358)
	at com.sun.xml.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:499)
	at app.App.main(App.java:60)
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)

alguem me da uma ideia???

obrigado

Mrwin

Usei o exemplo do amigo acima com o package-info.java e funcionou tranquilamente

Marcelo_Bento

ThiagoInGuj, caraaaa… vc salvou meu dia, fiz como você informou e deu certinho…

Diferente dessas pessoas que somente diz que resolveu e não posta a solução, vou postar aqui.:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.meunamespace.inf.br",
		xmlns =
		  {
		    @javax.xml.bind.annotation.XmlNs(prefix = "",
		      namespaceURI="http://www.meunamespace.inf.br")
		  },
		elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)	
package br.inf.portalfiscal.nfe;

Criei o arquivo package-info.java, coloquei dentro da pasta onde gera o XML e funfou perfeitamente.

Criado 25 de maio de 2011
Ultima resposta 7 de fev. de 2013
Respostas 13
Participantes 8