Setar namespace no xml com JAXB [RESOLVIDO]

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!

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

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

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!

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

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:

pode postar o resultado final ?

Tu quer o código completo?

pode ser! manda os import tb

resolvi aqui!

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:

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

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

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.