O retorno de um metodo no webservice é uma lista desse objeto. Quando estou fazendo os teste no SOAPUI da um erro:
"javax.xml.bind.JAXBException: class java.util.ArrayList nor any of its super class is known to this context."
Dei uma pesquisada na internet e vi que o erro está dando por causa que existe esse atributo valor com o tipo Object. … realmente eu fiz um teste tirando esse atributo e o método funcionou. Minha pergunta é: tem como fazer esse método funcionar com esse tipo Object? O valor desse campo pode ser qualquer coisa, string, double, uma lista de objetos, um objecto meu … qualquer coisa.
E agora esta dando um erro no deploy da aplicacao no servidor. Diz que tenho dois atributos com o mesmo nome. :? ?
[code]11:59:03,215 ERROR [MainDeployer] Could not start deployment: file:/…/aplicacao.war
java.lang.IllegalStateException: Cannot build JAXB context
at org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilder.createJAXBContext(JAXWSMetaDataBuilder.java:955)
at org.jboss.ws.metadata.builder.jaxws.JAXWSWebServiceMetaDataBuilder.buildWebServiceMetaData(JAXWSWebServiceMetaDataBuilder.java:156)
at org.jboss.ws.metadata.builder.jaxws.JAXWSServerMetaDataBuilder.setupProviderOrWebService(JAXWSServerMetaDataBuilder.java:52)
at org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilderJSE.buildMetaData(JAXWSMetaDataBuilderJSE.java:63)
at org.jboss.wsf.stack.jbws.UnifiedMetaDataDeploymentAspect.create(UnifiedMetaDataDeploymentAspect.java:66)
at org.jboss.wsf.framework.deployment.DeploymentAspectManagerImpl.deploy(DeploymentAspectManagerImpl.java:118)
at org.jboss.wsf.container.jboss42.ArchiveDeployerHook.deploy(ArchiveDeployerHook.java:97)
at org.jboss.wsf.container.jboss42.DeployerInterceptor.start(DeployerInterceptor.java:90)
at org.jboss.deployment.SubDeployerInterceptorSupport$XMBeanInterceptor.start(SubDeployerInterceptorSupport.java:188)
at org.jboss.deployment.SubDeployerInterceptor.invoke(SubDeployerInterceptor.java:95)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
at $Proxy45.start(Unknown Source)
at org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025)
at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:819)
at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782)
at sun.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
at $Proxy9.deploy(Unknown Source)
at org.jboss.deployment.scanner.URLDeploymentScanner.deploy(URLDeploymentScanner.java:421)
at org.jboss.deployment.scanner.URLDeploymentScanner.scan(URLDeploymentScanner.java:634)
at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.doScan(AbstractDeploymentScanner.java:263)
at org.jboss.deployment.scanner.AbstractDeploymentScanner.startService(AbstractDeploymentScanner.java:336)
at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)
at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245)
at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)
at $Proxy0.start(Unknown Source)
at org.jboss.system.ServiceController.start(ServiceController.java:417)
at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
at $Proxy4.start(Unknown Source)
at org.jboss.deployment.SARDeployer.start(SARDeployer.java:304)
at org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025)
at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:819)
at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782)
at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:766)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
at $Proxy5.deploy(Unknown Source)
at org.jboss.system.server.ServerImpl.doStart(ServerImpl.java:482)
at org.jboss.system.server.ServerImpl.start(ServerImpl.java:362)
at org.jboss.Main.boot(Main.java:200)
at org.jboss.Main$1.run(Main.java:508)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.jboss.ws.WSException: Failed to create JAXBContext
at org.jboss.ws.core.jaxws.CustomizableJAXBContextFactory.createContext(CustomizableJAXBContextFactory.java:116)
at org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilder.createJAXBContext(JAXWSMetaDataBuilder.java:951)
… 81 more
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Class has two properties of the same name “valor”
this problem is related to the following location:
at public java.lang.Object pacote.CampoTO.getValor()
at pacote.CampoTO
at private java.util.List pacote.jaxws.VerificarRetificacaoDocumentoArrecadacaoResponse._return
at pacote.jaxws.VerificarRetificacaoDocumentoArrecadacaoResponse
this problem is related to the following location:
at private java.lang.Object pacote.CampoTO.valor
at pacote.CampoTO
at private java.util.List pacote.ws.jaxws.VerificarRetificacaoDocumentoArrecadacaoResponse._return
at pacote.ws.jaxws.VerificarRetificacaoDocumentoArrecadacaoResponse
at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:438)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:286)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:139)
at com.sun.xml.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:105)
at org.jboss.ws.core.jaxws.CustomizableJAXBContextFactory.createContext(CustomizableJAXBContextFactory.java:110)
... 82 more[/code]
Olha só, fazendo uns testes aqui eu vi que o problema não é o fato de estar retornando esse tipo java.lang.Object.
Eu retirei a anotação do campo valor. E em outra parte do código eu comentei o trecho que atribuía um objetro complexo (Definido dentro da minha aplicação). Depois de comentar esse trecho o webservice funcionou.
Tem um trecho da aplicação que atribui um List para esse valor em CampoTO (ReceitaTO é um bean na minha aplicação). Acredito que o problema está nessa atribuição de uma lista para esse valor com tipo Object … esse tipo object pode ser uma lista de outro objeto?
edit
Só um detalhe eu não queria alterar a assinatura do método se possível.
edit2
Mais uns testes, o erro não é nem por causa da lista, tentei passar só o objeto ReceitaTO e deu erro
javax.xml.bind.JAXBException: class pacote.ReceitaTO nor any of its super class is known to this context.
E ai? Quando eu coloco a anotação @XmlAnyElement no valor, ele reclama do get do atributo … se eu tiro a anotação dá erro no bind do JAXB.
Como tem vários métodos no serviço vou colocar só o que está dando problema. Segue a classe do webservice.
[code]@WebService
public class SIEFRDOCVIAWebService implements IFacade, IBusinessController {
/**
* <p>
* Determina se um arquivo deserializado é compativel com esta classe.
* </p>
*
* <p>
* Mantenedores devem mudar este valor se e somente se a nova versão desta
* classe não for campatível com as versões antigas.
* </p>
*/
private static final long serialVersionUID = 6185808281985483765L;
@Injection
private IDocumentoArrecadacaoBC documentoArrecadacaoBC;
@WebMethod
public List<CampoTO> verificarRetificacaoDocumentoArrecadacao(
@WebParam(name = "tipoRetificacao") String tipoRetificacao,
@WebParam(name = "docArrecTO") DocumentoArrecadacaoTO docArrecTO)
throws SIEFRDOCVIAWSException {
List<CampoTO> result = null;
result = documentoArrecadacaoBC.verificarRetificacaoDocumentoArrecadacao(
tipoRetificacao, docArrecTO);
return result;
}
}[/code]
Segue a classe ReceitaTO
[code]public class ReceitaTO implements Serializable, Comparable {
/**
* <p>
* Determina se um arquivo deserializado é compativel com esta classe.
* </p>
*
* <p>
* Mantenedores devem mudar este valor se e somente se a nova versão desta
* classe não for campatível com as versões antigas.
* </p>
*/
private static final long serialVersionUID = -5682300699170618524L;
private String recCd;
private String recTp;
private Double valor;
public final void setRecTp(final String recTp) {
this.recTp = recTp;
}
public final String getRecTp() {
return recTp;
}
public final void setValor(final Double valor) {
this.valor = valor;
}
public final Double getValor() {
return valor;
}
public final void setRecCd(final String recCd) {
this.recCd = recCd;
}
public final String getRecCd() {
return recCd;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((recCd == null) ? 0 : recCd.hashCode());
result = prime * result + ((recTp == null) ? 0 : recTp.hashCode());
result = prime * result + ((valor == null) ? 0 : valor.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ReceitaTO other = (ReceitaTO) obj;
if (recCd == null) {
if (other.recCd != null)
return false;
} else if (!recCd.equals(other.recCd))
return false;
if (recTp == null) {
if (other.recTp != null)
return false;
} else if (!recTp.equals(other.recTp))
return false;
if (valor == null) {
if (other.valor != null)
return false;
} else if (!valor.equals(other.valor))
return false;
return true;
}
@Override
public String toString() {
return "ReceitaTO [recCd=" + recCd + ", recTp=" + recTp + ", valor="
+ valor + "]";
}
public int compareTo(ReceitaTO o) {
if (this.getRecTp().equals(o.getRecTp())) {
return 0;
} else if (this.getRecTp().equals(
MensagemTransformacaoConstante.PRINCIPAL)) {
return 1;
} else if (this.getRecTp().equals(
MensagemTransformacaoConstante.MULTA) && o.getRecTp().equals(
MensagemTransformacaoConstante.JUROS)) {
return 1;
} else{
return -1;
}
}
}[/code]
A classe CampoTO já foi postada num post anterior.
edit
Como o método do BC eh bem grande vou resumir o que importa. Ele retorna uma lista de CampoTO e um dos elementos desse List é uma lista de ReceitaTO.
Caso eu comente essa linha de código o webservice funciona normalmente. Já que todos os outros campos são Double, String, Long … somente esse campo é um objeto complexo definido na aplicação.