[Resolvido]VRaptor consumir json com List

1 resposta
dani3lviana

Boa tarde

Estou tentando consumir um json que tem uma lista.

Meu pojo é o seguinte:

public class Invoice implements Pojo<Long> {

	private Long id;
	private String	numberInvoice;
	private Provider provider;
	private List<ItemInvoice> itemInvoices;
	private LocalDate issueDate;
	private InvoiceType type;
}

A classe da lista:

public class ItemInvoice implements Pojo<Long> {	
	private Long id;
	private Product product;
	private Invoice invoice;
	private Integer quantity;
	private Double unitPrice;
}

E o meu controller está definido assim:

@Post("/invoice")
	@Consumes("application/json")
	public void save(Invoice invoice) { }

Tento passar o seguinte json:

{"invoice": {"id": 1,"numberInvoice": "12345","itemInvoices": [{"id": 1,"quantity": 10,"unitPrice": 10.0}],"type": "In"}}

E recebo o seguinte erro:

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.dani3lviana.manager.model.Invoice
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.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:51)
	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.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.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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	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.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 com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
	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:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	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.CachingMapper.realClass(CachingMapper.java:52)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
	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)
	... 62 more

1 Resposta

dani3lviana

A solução foi adicionar o gson ao projeto

<dependency>
	<groupId>com.google.code.gson</groupId>
	<artifactId>gson</artifactId>
	<version>2.2.4</version>
</dependency>

E criar as seguintes classes:

@Component
@ApplicationScoped
public class Deserializers extends DefaultDeserializers {
   @Override
   public Deserializer deserializerFor(String contentType, Container container) {
      if ("application/json".equals(contentType)) {
          return container.instanceFor(GsonDeserialize.class);
      }
      return super.deserializerFor(contentType, container);
   }
}
@Component
public class GsonDeserialize extends GsonDeserialization {

	public GsonDeserialize(ParameterNameProvider paramNameProvider,
		@SuppressWarnings("rawtypes") 
		List<JsonDeserializer> adapters) {
			super(paramNameProvider, adapters);
		}
}
Criado 1 de junho de 2013
Ultima resposta 2 de jun. de 2013
Respostas 1
Participantes 1