Erro no retorno de Webservice [+AJUDA]

8 respostas
rollei

Pessoal to com um engodo aqui.

Tenho um objeto que é um retorno num Webservice.

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

	private String nomeCampo;
	
	private Boolean alteravel;
	
	private Object valor;
        
        .
        .
        .
}

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.

8 Respostas

Alexandre_Saudate

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

[]´s

sanjust

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)

rollei

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. :? ?

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

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

Alexandre_Saudate

Poste o código completo da classe CampoTO…

[]´s

rollei
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;
	}
}

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

rollei

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.

sanjust

Tem como colocar as 3 classes aí pra gente?

Os beans e o webservice?

Saudações. 8)

rollei

Como tem vários métodos no serviço vou colocar só o que está dando problema. Segue a classe do webservice.

@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;
    }
}

Segue a classe ReceitaTO

public class ReceitaTO implements Serializable, Comparable<ReceitaTO> {

    /**
        * <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;
		}
	}
}

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.

Criado 2 de março de 2011
Ultima resposta 2 de mar. de 2011
Respostas 8
Participantes 3