Web Service + JAXB 2.1

Bom dia a todos!
Estou fazendo uma implementação para um web service, em um dos métodos eu precisarei enviar os dados de um pedido + itens do Pedido + parcelas do pedido (Registros Master+Detail), neste contexto eu quero enviar um xml para o web service e o mesmo fazer a inclusão toda em uma única transação.
Para atender isso estudei que uma das formas é utilizando o JAXB que possibilita trabalhar com suas classes usando XML.
Meu web service esta rodando sobre o Glassfish 3.0.
Tentei fazer uma implementação, mas quando acesso meu web service recebo a seguinte exception:

WARNING: Servlet web service endpoint 'WSJSistemaBalcao' failure
javax.xml.ws.WebServiceException: Unable to create JAXBContext
        at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:166)
        at com.sun.xml.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:94)
        at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:258)
        at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:338)
        at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:201)
        at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:505)
        at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:560)
        at org.glassfish.webservices.JAXWSServlet.registerEndpoint(JAXWSServlet.java:405)
        at org.glassfish.webservices.JAXWSServlet.doInit(JAXWSServlet.java:264)
        at org.glassfish.webservices.JAXWSServlet.init(JAXWSServlet.java:99)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1428)
        at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:1060)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:187)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
        at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
        at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
        at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
        at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
        at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
        at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
        at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
        at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
        at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
        at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
        at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.security.PrivilegedActionException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.lang.StackTraceElement does not have a no-arg default constructor.
        this problem is related to the following location:
                at java.lang.StackTraceElement
                at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace()
                at java.lang.Throwable
                at public java.lang.Throwable br.com.sistemabalcao.ws.jaxws.JAXBExceptionBean.linkedException
                at br.com.sistemabalcao.ws.jaxws.JAXBExceptionBean
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:153)
        ... 34 more
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.lang.StackTraceElement does not have a no-arg default constructor.
        this problem is related to the following location:
                at java.lang.StackTraceElement
                at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace()
                at java.lang.Throwable
                at public java.lang.Throwable br.com.sistemabalcao.ws.jaxws.JAXBExceptionBean.linkedException
                at br.com.sistemabalcao.ws.jaxws.JAXBExceptionBean
        at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:472)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1140)
        at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
        at com.sun.xml.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:106)
        at com.sun.xml.ws.developer.JAXBContextFactory$1.createJAXBContext(JAXBContextFactory.java:109)
        at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:161)
        at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:154)
        ... 36 more

WARNING: StandardWrapperValve[WSJSistemaBalcao]: PWC1382: Allocate exception for servlet WSJSistemaBalcao
javax.servlet.ServletException
        at org.glassfish.webservices.JAXWSServlet.doInit(JAXWSServlet.java:271)
        at org.glassfish.webservices.JAXWSServlet.init(JAXWSServlet.java:99)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1428)
        at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:1060)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:187)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
        at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
        at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
        at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
        at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
        at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
        at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
        at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
        at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
        at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
        at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
        at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
        at java.lang.Thread.run(Thread.java:619)
Caused by: javax.xml.ws.WebServiceException: Unable to create JAXBContext
        at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:166)
        at com.sun.xml.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:94)
        at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:258)
        at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:338)
        at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:201)
        at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:505)
        at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:560)
        at org.glassfish.webservices.JAXWSServlet.registerEndpoint(JAXWSServlet.java:405)
        at org.glassfish.webservices.JAXWSServlet.doInit(JAXWSServlet.java:264)
        ... 26 more
Caused by: java.security.PrivilegedActionException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.lang.StackTraceElement does not have a no-arg default constructor.
        this problem is related to the following location:
                at java.lang.StackTraceElement
                at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace()
                at java.lang.Throwable
                at public java.lang.Throwable br.com.sistemabalcao.ws.jaxws.JAXBExceptionBean.linkedException
                at br.com.sistemabalcao.ws.jaxws.JAXBExceptionBean
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:153)
        ... 34 more
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.lang.StackTraceElement does not have a no-arg default constructor.
        this problem is related to the following location:
                at java.lang.StackTraceElement
                at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace()
                at java.lang.Throwable
                at public java.lang.Throwable br.com.sistemabalcao.ws.jaxws.JAXBExceptionBean.linkedException
                at br.com.sistemabalcao.ws.jaxws.JAXBExceptionBean
        at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:472)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1140)
        at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
        at com.sun.xml.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:106)
        at com.sun.xml.ws.developer.JAXBContextFactory$1.createJAXBContext(JAXBContextFactory.java:109)
        at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:161)
        at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:154)
        ... 36 more

Minha classe mapeada:

@Entity
@Table(name = "TRANSFERENCIA")
@NamedQueries({
    @NamedQuery(name = "Transferencia.findAll", query = "SELECT t FROM Transferencia t")})
@XmlRootElement(name="TRANSFERENCIA", namespace = "br.com.sistemabalcao.entidade")
@XmlType(name="TRANSFERENCIA_TP")
@XmlAccessorType(XmlAccessType.FIELD)
public class Transferencia implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "CO_TRANSFERENCIA")
    @XmlElement(name="coTransferencia")
    private Double coTransferencia;
    @Basic(optional = false)
    @Column(name = "DT_DATA")
    @Temporal(TemporalType.DATE)
    @XmlElement(name="dtData")
    private Date dtData;
    @Column(name = "DT_DATAINS")
    @Temporal(TemporalType.TIMESTAMP)
    @XmlElement(name="dtDatains")
    private Date dtDatains;
    @Column(name = "VL_LIQTRANSF")
    @XmlElement(name="vlLiqtransf")
    private Double vlLiqtransf;
    @Column(name = "VL_BRUTOTRANSF")
    @XmlElement(name="vlBrutotransf")
    private Double vlBrutotransf;
    @Column(name = "NO_STATUS")
    @XmlElement(name="noStatus")
    private String noStatus;
    @Column(name = "NU_CAIXA")
    @XmlElement(name="nuCaixa")
    private Integer nuCaixa;
    @Column(name = "NO_OBS")
    @XmlElement(name="noObs")
    private String noObs;
    @Column(name = "NU_QTDEPARCELAS")
    @XmlElement(name="nuQtdeparcelas")
    private Integer nuQtdeparcelas;
    @OneToMany(mappedBy = "transferencia")
    @XmlElementWrapper
    private List<MovComercialParc> movComercialParcList;
    @JoinColumn(name = "CO_USUARIO", referencedColumnName = "USU_COD")
    @ManyToOne
    private Usuario usuario;
    @JoinColumn(name = "CO_FORMAPAGTO", referencedColumnName = "CO_FORMAPAGTO")
    @ManyToOne
    private Formapagto formapagto;
    @JoinColumn(name = "CO_FILIALDESTINO", referencedColumnName = "CO_FILIAL")
    @ManyToOne(optional = false)
    private Filial filialDestino;
    @JoinColumn(name = "CO_FILIALORIGEM", referencedColumnName = "CO_FILIAL")
    @ManyToOne(optional = false)
    private Filial filialOrigem;

    public Transferencia() {
    }

    public Transferencia(Double coTransferencia) {
        this.coTransferencia = coTransferencia;
    }
     
    ... //retirei os getters e setters para reduzir o código
    

Método Teste para implementação:

        TransferenciaDao transfDao = new TransferenciaDao();
        List<Object[]> lstTransf = transfDao.getTransferenciaID(Double.parseDouble("23"));

        for (Object oTransf : lstTransf){
            JAXBContext context = JAXBContext.newInstance(Transferencia.class);
            Marshaller m = context.createMarshaller();
            //m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            m.marshal(oTransf, System.out);
        }

Dei uma pesquisada sobre estas mensagens, mas não consegui resolver, alguém tem idéia do que posso fazer ou do que possa estar errado.

Ninguém faz idéia do que possa estar acontecendo?
Será que o problema esta relacionado a versao do JAXB?

Não, não é a versão do JAXB. O problema é que seu web service expôs alguma exception de negócio e, por padrão, está pegando todas as propriedades de Exception. Neste ponto, tudo bem, sem problemas… exceto pelo fato de que o JAXB está pegando qualquer coisa que comece com “get” e expondo como XML, inclusive o método getStackTrace da Exception (na verdade, de Throwable, mas quem liga pra nomenclatura? =P ).

Poste as possíveis exceptions que você está mapeando no seu web service que eu te mostro como resolver o problema.

[]´s

Asaudate, obrigado por responder!
Ontem a noite me deu uma luz, eu peguei e comecei a reescrever o método de teste que antes era assim:

@WebMethod
    public String getTeste() throws JAXBException {

        TransferenciaDao transfDao = new TransferenciaDao();
        List<Transferencia> lstTransf = transfDao.getTransferenciaID(Double.parseDouble("23"));

        for (Transferencia oTransf : lstTransf){
                JAXBContext context = JAXBContext.newInstance(Transferencia.class);
                Marshaller m = context.createMarshaller();
                //m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
                m.marshal(oTransf, System.out);
        }


        return "";
    }

E alterei pra ficar desta forma

@WebMethod
    public String getTeste(){

        TransferenciaDao transfDao = new TransferenciaDao();
        List<Transferencia> lstTransf = transfDao.getTransferenciaID(Double.parseDouble("23"));

        for (Transferencia oTransf : lstTransf){
            try {
                JAXBContext context = JAXBContext.newInstance(Transferencia.class);
                Marshaller m = context.createMarshaller();
                //m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
                m.marshal(oTransf, System.out);
            } catch (JAXBException ex) {
                Logger.getLogger(WSJSistemaBalcao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }


        return "";
    }

Você saberia me dizer porque esta diferença usando “throws JAXBException”?

[quote=asaudate]Não, não é a versão do JAXB. O problema é que seu web service expôs alguma exception de negócio e, por padrão, está pegando todas as propriedades de Exception. Neste ponto, tudo bem, sem problemas… exceto pelo fato de que o JAXB está pegando qualquer coisa que comece com “get” e expondo como XML, inclusive o método getStackTrace da Exception (na verdade, de Throwable, mas quem liga pra nomenclatura? =P ).

Poste as possíveis exceptions que você está mapeando no seu web service que eu te mostro como resolver o problema.

[]´s[/quote]
Não seria interessante o rapaz criar mais camadas nessa arquitetura?

[quote=felipeguerra][quote=asaudate]Não, não é a versão do JAXB. O problema é que seu web service expôs alguma exception de negócio e, por padrão, está pegando todas as propriedades de Exception. Neste ponto, tudo bem, sem problemas… exceto pelo fato de que o JAXB está pegando qualquer coisa que comece com “get” e expondo como XML, inclusive o método getStackTrace da Exception (na verdade, de Throwable, mas quem liga pra nomenclatura? =P ).

Poste as possíveis exceptions que você está mapeando no seu web service que eu te mostro como resolver o problema.

[]´s[/quote]
Não seria interessante o rapaz criar mais camadas nessa arquitetura?[/quote]

Felipe o que você sugere?

Então, eu utilizo a abordagem que começa pelo WSDL, à partir daí separei a parte de acesso a dados, business e principalmente o modelo, as classes que estão mapeadas no meu ORM não são as mesmas mapeadas pelos JAXB.

Você sugere que eu tenha duas classes: uma mapea pelo ORM e outra para o JAXB? Mas isso não aumentaria a manutenção das classes?
Você já deve ter uma certa experiencia, quais seriam os ganhos montando estas camadas?

Isso eu sugiro, pq do jeito que está fica fortemente acoplado, né?

É claro que qualquer coisa que eu for recomendar, primeiro eu teria que olhar o todo, ou seja, não só a parte do WS, mas toda a necessidade.

Como tudo em TI: depende. Pra um sistema pequeno, que precisa ser desenvolvido rápido, é bastante interessante deixar o mesmo objeto que enxerga o banco trafegar como XML, também. Isso porque você sabe que não vai precisar de grandes mudanças e, se inserir uma propriedade a mais, por exemplo, sabe dizer se ela precisa trafegar ou não.

Já pra sistemas maiores, a coisa muda de figura. Se você tem muitas entidades, ao mexer em alguma delas não tem como prever se vai afetar outras partes ou não (em especial, clientes, que só sabem reclamar em runtime). Assim, você pode afetar muitas coisas e gerar um pesadelo de manutenção maior do que manter classes separadas.

Quanto à exceção que você tinha dito, o que acontece é o seguinte: JAXBException não é feita para trafegar como XML. Isso porque ela ocorre, tipicamente, quando está fazendo marshall/unmarshall de XML (coisa que, teoricamente, você deveria fazer de maneira automatizada). A intenção do JAXB é que somente exceções de negócio vão trafegar como XML, e que portanto você tem acesso ao código e essas exceções estão mapeadas para o JAXB. Assim, concluindo… se você quer lançar uma exceção pelo seu webservice, crie uma exceção (de negócio, preferencialmente), mapeie-a e a lance.

[]´s