Erro no retorno de Webservice [+AJUDA]

Pessoal to com um engodo aqui.

Tenho um objeto que é um retorno num Webservice.

[code]
public class CampoTO implements Serializable {
private static final long serialVersionUID = 6489024740627725254L;

private String nomeCampo;

private Boolean alteravel;

private Object valor;
    
    .
    .
    .

}[/code]

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.

Tem sim. É só anotar o object com @XmlAnyElement.

[]´s

Dessa eu também não sabia.

Aí vai o link da anotação:

http://download.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlAnyElement.html

Saudações. 8)

Adicionei a anotacao no atributo

@XmlAnyElement private Object valor;

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]

Alguém pode me dar uma direção?

Poste o código completo da classe CampoTO…

[]´s

[code]package caminhopacote;

import java.io.Serializable;

import javax.xml.bind.annotation.XmlAnyElement;

public class CampoTO implements Serializable {
private static final long serialVersionUID = 6489024740627725254L;

private String nomeCampo;

private Boolean alteravel;

@XmlAnyElement(lax=true)
private Object valor;

public CampoTO() {
}

public CampoTO(String nomeCampo) {
	super();
	
	this.nomeCampo = nomeCampo;
}

public CampoTO(String nomeCampo, Boolean alteravel, Object valor) {
	super();
	
	this.nomeCampo = nomeCampo;
	this.alteravel = alteravel;
	this.valor = valor;
}

public String getNomeCampo() {
	return nomeCampo;
}

public void setNomeCampo(String nomeCampo) {
	this.nomeCampo = nomeCampo;
}

public Boolean getAlteravel() {
	return alteravel;
}

public void setAlteravel(Boolean alteravel) {
	this.alteravel = alteravel;
}

public Object getValor() {
	return valor;
}

public void setValor(Object valor) {
	this.valor = valor;
}

public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result
			+ ((nomeCampo == null) ? 0 : nomeCampo.hashCode());
	return result;
}

public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	CampoTO other = (CampoTO) obj;
	if (nomeCampo == null) {
		if (other.nomeCampo != null)
			return false;
	} else if (!nomeCampo.equals(other.nomeCampo))
		return false;
	return true;
}

}
[/code]

Esse lax na anotação tava testando agora. Primeiro coloquei sem.

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.

Tem como colocar as 3 classes aí pra gente?

Os beans e o webservice?

Saudações. 8)

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.

camposAlteraveis.add(new CampoTO("receitaList", true, docArrecOriginalTO.getReceitaList()));

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.