Erro de conversão Xstream - projeto vraptor

23 respostas
R

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

L

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

R

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

L

qual é o tipo da lista amounts?

R

é 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

L

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

R

exato!

L

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

R

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

R

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
-------------------------------
L

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

R

exato, corrigi da o erro acima.

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

L

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…

R

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

L

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.

R

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

L

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?

R

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

L

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

R

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

R

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

L

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?

R

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

L

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