Erro de conversão Xstream - projeto vraptor

23 respostas
renanreismartins

Prezados tenho um projeto que utiliza o Xstream e Vraptor

tenho um payload que é um obj contendo uma lista de outros obj de tipos diferentes. a lista é de amounts… Ex:

{
    "obligationToPay": {
        "@resolves-to": "obligationToPay",
        "id": 1,
      
        "lastObservation": "last",
        
        "amounts": [{
            "id": 18,
            "amount": "100.00"
        }],
        "account": {
            "id": 19,
            "number": "132"
        },

        "paymentType": "DEPOSIT_ACCOUNT"
    }
}

Quando envio o json para o controller:

@Consumes
	@Put("/obligationsToPay/{id}")
	public void update(ObligationToPay obligationToPay) {....

recebo:

com.thoughtworks.xstream.converters.ConversionException: id : id : id : id
---- Debugging information ----
message             : id : id
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : id : id
class               : br.com.fourdata.model.cco.ObligationToPay
required-type       : java.util.ArrayList
line number         : -1
-------------------------------
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:861)
	at br.com.caelum.vraptor.deserialization.JsonDeserializer.deserialize(JsonDeserializer.java:62)
	at br.com.caelum.vraptor.interceptor.DeserializingInterceptor.intercept(DeserializingInterceptor.java:87)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: id : id
	at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:68)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:71)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:86)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:96)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:52)
	at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
	at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:70)
	at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:68)
	at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:61)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
	... 57 more

é um problema de conversao do xstream … alguem ja passou por isso? para deserealizar funciona normalmente…

abrass

23 Respostas

Lucas_Cavalcanti

o problema é que o cara que deserializa o json é diferente do que serializa, dentro do xstream, então não necessariamente dá pra deserializar um objeto que vc serializou com ele.

tenta mandar o json sem o amounts, pra ver se funciona… se sim, tenta ver se o formato não é um pouco diferente

renanreismartins

oi lucas, sem o amounts sai do mesmo jeito, apenas sem a coleção

{
    "obligationToPay": {
        "@resolves-to": "obligationToPay",
        "id": 1,
        "lastObservation": "last",
        "account": {
            "id": 19,
            "number": "132"
        },
        "paymentType": "DEPOSIT_ACCOUNT"
    }
}

assim ele deserealiza normalmente, porém da erro na minha validação pois preciso da coleção.

abrassss

Lucas_Cavalcanti

qual é o tipo da lista amounts?

renanreismartins

é um tipo que eu mesmo criei

@Audited
@Entity
public class Amount {
	@Id
	@GeneratedValue
	private Long id;

	// Amount informed in payment
	@Column(precision = 15, scale = 2)
	@NotNull(message = "Informe o valor.")
	private BigDecimal amount;

	// Amount updated for payment
	@Column(precision = 15, scale = 2)
	private BigDecimal updatedAmount;

	@OneToOne
	@NotNull(message = "Informe o tipo do valor.")
	private AmountType type;

	public Amount(BigDecimal amount, AmountType type) {
		this.amount = amount;
		this.type = type;
	}

	public Amount() {

	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public BigDecimal getAmount() {
		return amount;
	}

	public void setAmount(BigDecimal amount) {
		this.amount = amount;
	}

	public BigDecimal getUpdatedAmount() {
		return updatedAmount;
	}

	public void setUpdatedAmount(BigDecimal updatedAmount) {
		this.updatedAmount = updatedAmount;
	}

	public AmountType getType() {
		return type;
	}

	public void setType(AmountType type) {
		this.type = type;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.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;
		Amount other = (Amount) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	public Boolean isUpdated() {
		return updatedAmount != null;
	}
}

abrasss

Lucas_Cavalcanti

tudo bem, mas na classe obligationsToPay o campo amounts está declarado como List?

renanreismartins

exato!

Lucas_Cavalcanti

acho que ele espera que o campo no json esteja assim:

"amounts": [{ "amount": { 
            "id": 18,  
            "amount": "100.00"  
        }}],

tenta mudar pra isso e ver se funciona… se mesmo assim não funcionar tenta usar trocar esse primeiro amount pelo nome completo da classe

renanreismartins

não sei se estou exagerando, mas que absurdo um negocio serializar de um jeito e deserealizar de outro… pqp rs

fiz das duas maneiras com o nome normal:

{
    "obligationToPay": {
        "@resolves-to": "obligationToPay",
        "id": 1,
       "lastObservation": "last",
        "account": {
            "id": 19,
            "number": "132"
        },
        "amounts": [
            {
                "amount": {
                    "id": 18,
                    "amount": "100.00"
                }
            }
        ],
        "paymentType": "DEPOSIT_ACCOUNT"
    }
}
---- Debugging information ----
message             : amount : amount
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : amount : amount
class               : br.com.fourdata.model.cco.ObligationToPay
required-type       : java.util.ArrayList
line number         : -1
-------------------------------
	com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
	com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
	com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
	com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
	com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
	com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
	com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
	com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
	com.thoughtworks.xstream.XStream.fromXML(XStream.java:861)
	br.com.caelum.vraptor.deserialization.JsonDeserializer.deserialize(JsonDeserializer.java:62)
	br.com.caelum.vraptor.interceptor.DeserializingInterceptor.intercept(DeserializingInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
</pre></p><p><b>root cause</b> <pre>com.thoughtworks.xstream.mapper.CannotResolveClassException: amount : amount
	com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:68)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:71)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:86)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:96)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:52)
	com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
	com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:70)
	com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:68)
	com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:61)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
	com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
	com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
	com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
	com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
	com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
	com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
	com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
	com.thoughtworks.xstream.XStream.fromXML(XStream.java:861)
	br.com.caelum.vraptor.deserialization.JsonDeserializer.deserialize(JsonDeserializer.java:62)
	br.com.caelum.vraptor.interceptor.DeserializingInterceptor.intercept(DeserializingInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

e com o nome totalmente qualificado

{
    "obligationToPay": {
        "@resolves-to": "obligationToPay",
        "id": 1,
      
      
        "lastObservation": "last",
       
      
        "account": {
            "id": 19,
            "number": "132"
        },
        "br.com.fourdata.model.cco.amounts": [
            {
                "amount": {
                    "id": 18,
                    "amount": "100.00"
                }
            }
        ],
        "paymentType": "DEPOSIT_ACCOUNT"
    }
}
---- Debugging information ----
cause-exception     : java.lang.NullPointerException
cause-message       : null
class               : br.com.fourdata.model.cco.ObligationToPay
required-type       : br.com.fourdata.model.cco.ObligationToPay
line number         : -1
-------------------------------
	com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
	com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
	com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
	com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
	com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
	com.thoughtworks.xstream.XStream.fromXML(XStream.java:861)
	br.com.caelum.vraptor.deserialization.JsonDeserializer.deserialize(JsonDeserializer.java:62)
	br.com.caelum.vraptor.interceptor.DeserializingInterceptor.intercept(DeserializingInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
</pre></p><p><b>root cause</b> <pre>java.lang.NullPointerException
	br.com.caelum.vraptor.serialization.xstream.VRaptorClassMapper.shouldSerializeMember(VRaptorClassMapper.java:55)
	com.thoughtworks.xstream.mapper.MapperWrapper.shouldSerializeMember(MapperWrapper.java:110)
	com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.determineType(AbstractReflectionConverter.java:342)
	com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:208)
	com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
	com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
	com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
	com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
	com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
	com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
	com.thoughtworks.xstream.XStream.fromXML(XStream.java:861)
	br.com.caelum.vraptor.deserialization.JsonDeserializer.deserialize(JsonDeserializer.java:62)
	br.com.caelum.vraptor.interceptor.DeserializingInterceptor.intercept(DeserializingInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

abrasss

renanreismartins

ops, errei ali em cima fiz com o json assim tb:

{
    "obligationToPay": {
        "@resolves-to": "obligationToPay",
        "id": 1,
      
        "lastObservation": "last",
      
        "account": {
            "id": 19,
            "number": "132"
        },
        "amounts": [
            {
                "br.com.fourdata.model.cco.amount": {
                    "id": 18,
                    "amount": "100.00"
                }
            }
        ],
        "paymentType": "DEPOSIT_ACCOUNT"
    }
}
---- Debugging information ----
message             : br.com.fourdata.model.cco.amount : br.com.fourdata.model.cco.amount
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : br.com.fourdata.model.cco.amount : br.com.fourdata.model.cco.amount
class               : br.com.fourdata.model.cco.ObligationToPay
required-type       : java.util.ArrayList
line number         : -1
-------------------------------
Lucas_Cavalcanti

sim, tb acho um absurdo :wink:

não era isso:

"br.com.fourdata.model.cco.amounts": [  
            {  
                "amount": {  
                    "id": 18,  
                    "amount": "100.00"  
                }  
            }  
        ],

era isso:

"amounts": [  
            {  
                "br.com.fourdata.model.cco.Amount": {  
                    "id": 18,  
                    "amount": "100.00"  
                }  
            }  
        ],

ou algo parecido

renanreismartins

exato, corrigi da o erro acima.

Semanticamente falando, em rest, eu nao deveria mandar essa collection correto? abrass

Lucas_Cavalcanti

dá o erro acima mesmo com o Amount maiúsculo? ou seja, o nome da classe mesmo.

bom, semanticamente depende :wink: vc está atualizando os amounts também? se sim, vc deveria passar sim.

tenta fazer um teste…

na classe ObligationsToPay, marque o atributo amounts com @XStreamImplicit e veja se funciona com o json inicial…

renanreismartins

lucas, deu certo colocando

{
    "obligationToPay": {
        "@resolves-to": "obligationToPay",
        "id": 1,
        "deadline": "02/04/2012",
        "status": "PENDING",
        "included": "02/03/2012 15:06:42",
        "lawsuit": {
            "id": 16,
            "processId": "Processo"
        },
        "creator": {
            "id": 1,
            "login": "renan",
            "password": "renan",
            "active": true
        },
        "lastObservation": "last",
        "receiptCompliance": {
            "id": 21,
            "path": "path",
            "originalName": "receipt.doc",
            "extension": ".doc",
            "size": "100.00",
            "resterictedFile": true
        },
        "generationLawsuitTaskEnd": "PREPARATION_BOOK",
        "amounts": [
            {
                "br.com.fourdata.model.cco.Amount": {
                    "id": 18,
                    "amount": "100.00"
                }
            }
        ],
        "account": {
            "id": 19,
            "number": "132"
        },
        "paymentType": "DEPOSIT_ACCOUNT"
    }
}

deu um erro antes pq devo ter errado em algo…

muito obrigado mesmo pela atenção.

Muito estranho esse comportamento não?!

vou tentar configurar isso com as anotações…

com relação a semantica, nao seria legal mandar a collection junto, concorda?

abrasss

Lucas_Cavalcanti

se vc não pretende atualizá-la, não…

se vc está atualizando, o ideal seria só mandar aquilo que vai ser atualizado (embora vc devesse usar o método PATCH e não PUT ou POST) mas isso mais por causa de segurança mesmo, e no controller só atualizar os campos que vc esperava que fossem atualizados.

renanreismartins

eheheh li o post assim que cheguei no trabalho.

PUT nao seria pra atualizar o meu objeto? pq PATCH?

uma ultima duvida, coloquei @XStreamImplicit no atributo amounts, dps tb tentei @XstreamAlias(“nomeQualificado”), e também tentei no meu customSerealization colocar:

xstream.alias("nomeQualificado", Amount.class);

mas nada fez os nós da lista vir com o nome.

alguma sugestao?

valeu lucas

abrasss

Lucas_Cavalcanti

não é no customSerialization, e sim no deserialization…

ou vc tá tentando gerar o json já com o nome completo da classe?

vc tá com qual versão do VRaptor?

renanreismartins

3.4.1-SNAPSHOT

estava fazendo na

public class CustomJSONSerialization extends XStreamJSONSerialization

o correto seria na serealização, pq eu pego o JSON, altero ele, dps envio de novo.

abrasss

Lucas_Cavalcanti

tudo bem, mas vc poderia tentar resolver tb na deserialização, que é a parte que está dando problema, não?

renanreismartins

estou tentando na deserealização.

O problema GRANDE é que em vários pontos do sistema, se eu pego um objeto serializado com um GET por exemplo, qdo dou um PUT, POST, ele não aceita o objeto.

O problema acorre também quando tento passar dois objs para um mesmo método. Por mais que eu crie um terceiro contendo os dois, faço um GET no terceiro, quando mando o mesmo json com PUT ou POST ele nao aceita.

Existe uma maneira de deixar esse comportamento padrão? Mesmo q trocando pra xml?

abrasss

renanreismartins

lucas, fiz uns testes desenvolvi uma classe, serializei, e deserializei com o Xstream:

Task task = new Task(1L);

		ObligationToPay obligationToPay = new ObligationToPay();
		obligationToPay.setId(1L);

		ObligationCancel oc = new ObligationCancel(task, obligationToPay);

		XStream xs = new XStream(new JettisonMappedXmlDriver());

		String xml = xs.toXML(oc);

		ObligationCancel newOc = (ObligationCancel) xs.fromXML(xml);

		System.out.println(newOc.getObligationToPay().getId());

funcionou normalmente.

Entao em um método GET consigo pegar o json do obj.

dps envio para um método que recebe o obj por POST, envio o mesmo json e o obj vem vazio. Conferi, existem todos os setters e etc.

Sera alguma config do vraptor?

PS: MEU CustomJSONSerialization usa o JettisonMappedXmlDriver

abrasss

Lucas_Cavalcanti

Tem que ver se o serializer e o deserializer estão usando o mesmo XStream. Se estão não deveria dar problemas…

vc tentou no seu teste pegar um objeto todo populado e fazer o toXML e fromXML?

renanreismartins

lucas, consegui resolver o problema. vou postar a solucao completa para que possa servir pra outras pessoas.

Ele serializava de um jeito e deserializava de outro colocando atributos no json como @class e @resolves-to, creio que por conta do hibernate.

Primeiro coloquei o CustomJSONSerialization para evitar circular reference ex. Como explicado aki:

http://www.wbotelhos.com.br/2010/08/26/vraptor-3-evitando-circularreferenceexception-do-xstream/

@Component
public class CustomJSONSerialization extends XStreamJSONSerialization {

	public CustomJSONSerialization(HttpServletResponse response, TypeNameExtractor extractor,
			ProxyInitializer initializer, XStreamBuilder builder) {
		super(response, extractor, initializer, builder);
	}

	@Override
	@SuppressWarnings("deprecation")
	protected XStream getXStream() {

		XStream xstream = super.getXStream();

		xstream.registerConverter(new CollectionConverter(xstream.getMapper()) {
			@Override
			@SuppressWarnings("rawtypes")
			public boolean canConvert(Class type) {
				return Collection.class.isAssignableFrom(type);
			}
		});

		return xstream;
	}
}

depois crei o CustomXStreamBuilder

@PrototypeScoped
@Component
public class CustomXStreamBuilder extends XStreamBuilderImpl {

	public CustomXStreamBuilder(XStreamConverters converters, TypeNameExtractor extractor) {
		super(converters, extractor);
	}

	// delega o construtor

	public XStream configure(XStream xstream) {

		super.configure(xstream);

		xstream.aliasSystemAttribute(null, "class");

		xstream.aliasSystemAttribute(null, "resolves-to");

		return xstream;

	}

}

para tirar os attr adicionais, como explicado aki: https://groups.google.com/forum/#!topic/caelum-vraptor/dnm8j4-YmVw

entao criei uma classe que continha as outras duas que precisava.

algo como isso:

public class ObligationCancel {

	private Task task;

	private ObligationToPay obligationToPay;

	public ObligationCancel() {

	}

	public ObligationCancel(Task task, ObligationToPay obligationToPay) {
		this.task = task;
		this.obligationToPay = obligationToPay;
	}
....

UFAAAAA!

vem mais duvidas ai nos retornos de list rsrs

abrasss

Lucas_Cavalcanti

bom que deu tudo certo, parabéns!

Criado 2 de março de 2012
Ultima resposta 7 de mar. de 2012
Respostas 23
Participantes 2