Alterar estrutura de geração de xml com JAX-WS

Tudo bem pessoal!!

Meu nome é Rafael, sou novo no forum e iniciante na linguagem java

Estou criando um webservice com JAX-WS que consulta os dados dos produtos da empresa no banco de dados oracle e retorna um xml como o que já está rodando em JSP

O XML de saída deve estar assim:

<micromap> <categoria total="1">Buscando por: "244"</categoria> <produtos> <prod> <nro>244</nro> <nome>Fonte P/ Cpu 300 W At</nome> <imagem>244.jpg</imagem> <valor>70,00</valor> <estoque>1</estoque> </prod> </produtos> </micromap>

Tudo bem, abaixo os POJOs

[code]@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Micromap {

@XmlElement(name="categoria")
Categoria categoria;

List<Prod> prod;        

public Micromap() {

}

public Micromap(List<Prod> produto, Categoria categoria) {
    this.prod= produto;
    this.categoria = categoria;
}    

public List<Prod> getProduto() {
    return prod;
}

public void setProduto(List<Prod> produto) {
    this.prod = produto;
}

public Categoria getCategoria() {
    return categoria;
}

public void setCategoria(Categoria categoria) {
    this.categoria = categoria;
}

}
[/code]

[code]@XmlAccessorType(XmlAccessType.FIELD)
public class Categoria {

@XmlAttribute(name=“total”)
private String total;

public Categoria() {
    
}

public Categoria(String total) {
    this.total = total;
}    

public String getTotal() {
    return total;
}

public void setTotal(String total) {
    this.total = total;
}

}[/code]

Para acessar o serviço uso o recurso produtos

@Path("/produtos")
public class RestProduto {
    
    @GET
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public Micromap getProdutos(@MatrixParam("cat") String cat, @MatrixParam("wh") String wh)
    {               
  
      MicromapDao micromap = new MicromapDao();    
      return micromap.exibir(cat, wh); 
    }       
    
}

E o projeto gera um xml assim:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <micromap> <categoria total="1" /> <prod> <descricao>FONTE P/ CPU 300 W AT</descricao> <estoque>1.0</estoque> <nome>Fonte P/ Cpu 300 W At</nome> <nome_imagem>244.jpg</nome_imagem> <nro>244</nro> <vnd_max>70.0</vnd_max> </prod> </micromap>

Repare que o que está faltando é que a tag categoria tenha abertura e fechamento e que exiba conteudo interno.

Já procurei no google muita coisa a respeito, mas tudo que encontro está muito longe de acerta-lo. Gostaria da ajuda de vocês para solucionar esse problema.

A grande questão minha é que a tag categoria tem que ser assim

Buscando por: “244”

e com os conhecimentos que tenho sobre JAX-WS oo resultado pode sair assim:

ou

Buscando por: “244”

Não sei o que fazer para funcionar os duas formas de uma vez

Tem alguém que trabalha com JAX-WS ou geração de xml através de classes de acesso a dados me de uma dica ai.

pelo que vi seu problema não é com o JAX-WS e sim com porque esta passando errado para o JAXB formar seu xml o correto sera a lista de produtos esta dentro do objeto Categoria e não na na clsse Micromap, abraços.

Aix,

Se eu colocar a lista de produtos dentro de categorias, o nó <pro> ficará dentro do nó <categoria>

E como o xml que eu preciso gerar com JAXB deve ser assim:

<micromap> <categoria total="1">Buscando por: "244"</categoria> <produtos> <prod> <nro>244</nro> <nome>Fonte P/ Cpu 300 W At</nome> <imagem>244.jpg</imagem> <valor>70,00</valor> <estoque>1</estoque> </prod> </produtos> </micromap>

Preciso fazer com que o elemento tenha abertura e fechamento e também uma string qualquer dentro como
no exemplo feito com JSP puro e que já está em funcionamento.

[quote=crawler]Aix,
Se eu colocar a lista de produtos dentro de categorias, o nó ficará dentro do nó
E como o xml que eu preciso gerar com JAXB deve ser assim:

Preciso fazer com que o elemento tenha abertura e fechamento e também uma string qualquer dentro como
no exemplo feito com JSP puro e que já está em funcionamento.[/quote]

ahhhh entendi, bem eu nunca precisei fazer isto teria que fazer um teste aqui, mas a solução me parece simples rsrsrssr no unmarshall vc tera a String toda do xml, da um replace e injeta la dentro o valor adicional :wink:

Como posso fazer isso através do JAX-WS, como faço para manipular com o unmarshall?

Qualquer dica será bem vinda comigo, pois não entendo muito do assunto e estou realmente precisando disso pronto.

Valeu

Olha só, quiz dizer se você não pode transformar tudo numa String e manipular ela ?

veja:

Micromap micromap = new Micromap();

    /**
     * Este método retorna o bean como uma String XML.
     *
     * @param <T>
     * @param bean - bean com os dados a serem apresentados.
     * @param formatted - informe 'true' se quiser ver o resultado em árvore.
     * @return - String XML representando os dados do bean.
     * @throws Throwable
     */
    public static <T> String getString(T bean, Boolean formatted) {
        StringWriter stringWriter = null;
        try {
            stringWriter = new StringWriter();
            StreamResult streamResult = new StreamResult(stringWriter);
            JAXBContext jaxbContext = JAXBContext.newInstance(bean.getClass());
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, formatted);
            marshaller.marshal(bean, streamResult);
        } catch (JAXBException ex) {
            System.out.println(ex.getLocalizedMessage());
        } finally {
            if (stringWriter != null) {
                try {
                    stringWriter.close();
                } catch (IOException ex) {
                    System.out.println(ex.getLocalizedMessage());
                }
            }
        }
        return stringWriter.toString();
    }

String result = getString(Micromap, true);

result.replace("<categoria total="1"/>","<categoria total="1">Buscando por: "244"</categoria>")

Obrigado por essa dica, amanhão vou estuda, testa-la e retornarei nesse tópico.