Vraptor + Rest + LocalDateTime[RESOLVIDO]

30 respostas
vasilvei

Bom dia!

Eu tenho duas aplicação uma em java desktop e outra em Java Web

e quero fazer um post do meu desktop para a web via Rest do Vraptor.

Objeto que estou fazendo o post (mesmo no web e desktop):

package br.com.coliseu.model;

// Generated 24/08/2012 21:53:13 by Hibernate Tools 3.4.0.CR1

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Type;
import org.joda.time.LocalDateTime;

import com.thoughtworks.xstream.annotations.XStreamAlias;

/**
 * Versaotabelas generated by hbm2java
 */
@Entity
@Table(name = "versaotabelas", schema = "coliseuarena")
@XStreamAlias("versaotabelas")
public class Versaotabelas implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -3553821381592680404L;
	private long idversaotabelas;
	private Filial filial;
	private String nometb;
	private String descricao;
	private Integer versao;
	private LocalDateTime dttimealter;

	public Versaotabelas() {
	}

	public Versaotabelas(long idversaotabelas) {
		this.idversaotabelas = idversaotabelas;
	}

	public Versaotabelas(long idversaotabelas, Filial filial, String nomeobj,
			String descricao, Integer versao, LocalDateTime dttimealter) {
		this.idversaotabelas = idversaotabelas;
		this.filial = filial;
		this.nometb = nomeobj;
		this.descricao = descricao;
		this.versao = versao;
		this.dttimealter = dttimealter;
	}

	@Id
	@Column(name = "idversaotabelas", unique = true)
	public long getIdversaotabelas() {
		return this.idversaotabelas;
	}

	public void setIdversaotabelas(long idversaotabelas) {
		this.idversaotabelas = idversaotabelas;
	}

	@Column(name = "nomeobj", length = 40)
	public String getNomeobj() {
		return this.nometb;
	}

	public void setNomeobj(String nomeobj) {
		this.nometb = nomeobj;
	}

	@Column(name = "descricao", length = 40)
	public String getDescricao() {
		return this.descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	@Column(name = "versao")
	public Integer getVersao() {
		return this.versao;
	}

	public void setVersao(Integer versao) {
		this.versao = versao;
	}

	@ManyToOne
	@JoinColumn(name = "estab")
	public Filial getFilial() {
		return filial;
	}

	public void setFilial(Filial filial) {
		this.filial = filial;
	}

	@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
	@Column(name = "dttimealter")
	public LocalDateTime getDttimealter() {
		return dttimealter;
	}

	public void setDttimealter(LocalDateTime dttimealter) {
		this.dttimealter = dttimealter;
	}

}

Parte do java desktop (ele chama apliacação web e tal mas quando vai deserializar o objeto da pau)

restfulie = Restfulie.custom();
        restfulie.getMediaTypes().register(new XmlMediaType().withTypes(Grupo.class, Produto.class, Item.class, Versaotabelas.class));

   ....

  VersaoTabelasTemp.versaoItem = respositoryVersaotabelas.dateItem(2);
        //pego a data
       LocalDateTime date = VersaoTabelasTemp.versaoItem;
     
        Versaotabelas versaotabelas = new Versaotabelas();
        versaotabelas.setDttimealter(date);

        Response response = restfulie.at("http://localhost:8080/CP/comunicador/atualizaItem").accept("application/xml").as("application/xml").post(versaotabelas);

Apl web:

@Post
	@Path("atualizaItem")
	@Consumes
	public void atualizaItem(Versaotabelas versaotabelas) {
		try {
			sessionUser.setEstab(2);
			List<Item> itemProduto = repositoryItem.atualizaItem(versaotabelas.getDttimealter());

...

CustomXStreamXMLDeserializer (Aqui que esta dando o erro)

package br.com.coliseu.util;

import br.com.caelum.vraptor.deserialization.XStreamXMLDeserializer;
import br.com.caelum.vraptor.http.ParameterNameProvider;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
@ApplicationScoped
@Component
public class CustomXStreamXMLDeserializer extends XStreamXMLDeserializer {

	public CustomXStreamXMLDeserializer(ParameterNameProvider provider) {
		super(provider, null);
	}

	/**
	 * Extension point to configure your xstream instance.
	 * @return the configured xstream instance
	 */
	@Override
	protected XStream getXStream() {
		XStream xStream = new XStream(new DomDriver());
		xStream.alias("versaotabelas", br.com.coliseu.model.Versaotabelas.class);
		return xStream;
	}


}

Erro:

11:14:26,118 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/CP].[default]] (http--127.0.0.1-8080-1) Servlet.service() for servlet default threw exception: com.thoughtworks.xstream.io.StreamException:  : Element type "org.joda.time.chrono.ISOChronology" must be followed by either attribute specifications, ">" or "/>".
	at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:86) [xstream-1.3.1.jar:]

....


	at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_03]
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 297; Element type "org.joda.time.chrono.ISOChronology" must be followed by either attribute specifications, ">" or "/>".
	at org.apache.xerces.parsers.DOMParser.parse(DOMParser.java:244)
	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:285)
	at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:79) [xstream-1.3.1.jar:]
	... 47 more

Aguém sabe como eu resolvo isso?

30 Respostas

Lucas_Cavalcanti

possivelmente o melhor jeito de resolver é criar converters pras datas tanto na serialização qto na deserialização…

daí vc converte pra dd/MM/yyyy HH:mm:ss e dá tudo certo

vasilvei

Eu tenho o converter assim:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.coliseu.util;

import org.joda.time.LocalDateTime;
import org.joda.time.format.DateTimeFormat;

import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;

/**
 * Classe utilizada para converter datas
 * @author valde
 */
public class LocalDateTimeConverter extends AbstractSingleValueConverter {


	@Override
	public boolean canConvert(Class type) {
		return LocalDateTime.class.equals(type);
    }

    @Override
    public String toString(Object obj) {
        try {

        return DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").print((LocalDateTime) obj);
        } catch (Exception e) {
            return "ERRO";
        }

    }
    @Override
    public Object fromString(String string) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}

isso que você se refere?

Lucas_Cavalcanti

vc tá registrando esse cara em algum lugar?

precisa implementar o toString E o fromString e registrar esse cara tanto no processo de serializar qto no de deserializar.

isso na parte web e na parte desktop

vasilvei

Eu tenho na apl web.

eu devo colocar no desktop também?

vasilvei

eu coloquei o converter no desktop também acontece o mesmo erro, devo fazer algo mais?

Lucas_Cavalcanti

se ele vai gerar/consumir xml, tb

Lucas_Cavalcanti

dá uma olhada no xml que está sendo gerado… e ve se não tem nenhum problema nele

vasilvei

Desculpe Lucas eu estou aprendo agora a trabalhar com rest e xml, como eu faço para eu visualizar o xml que esta sedo gerado na hora de enviar, quando eu envio ele vai direto no

package br.com.coliseu.util;

import br.com.caelum.vraptor.deserialization.XStreamXMLDeserializer;
import br.com.caelum.vraptor.http.ParameterNameProvider;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
@ApplicationScoped
@Component
public class CustomXStreamXMLDeserializer extends XStreamXMLDeserializer {

	public CustomXStreamXMLDeserializer(ParameterNameProvider provider) {
		super(provider, null);
	}

	/**
	 * Extension point to configure your xstream instance.
	 * @return the configured xstream instance
	 */
	@Override
	protected XStream getXStream() {
		XStream xStream = new XStream(new DomDriver());
		xStream.alias("versaotabelas", br.com.coliseu.model.Versaotabelas.class);
		return xStream;
	}


}
Lucas_Cavalcanti

acessa a url no browser, que vai aparecer o xml

vasilvei

Lucas eu coloquei um breakpoint no:

return DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").print((LocalDateTime) obj);

ele nem passa ali.

Lucas_Cavalcanti

vc registrou o converter em algum lugar?

vasilvei

Não registrei, aonde eu faço isso?
quando eu estou na minha aplicação web, e chama um autocomplete por exemplo, que tem LocalDateTime, ele passa pelo converter.

Lucas_Cavalcanti

no CustomXStreamXMLDeserializer, fazendo xstream.registerConverter(…) ou coisa do tipo

vasilvei

eu fiz isso:

@Override
	protected XStream getXStream() {
		XStream xStream = new XStream(new DomDriver());
		xStream.alias("versaotabelas", br.com.coliseu.model.Versaotabelas.class);
		xStream.registerConverter(new LocalDateTimeConverter());
		return xStream;
	}

eu fiz na aplicação web, e continua dando o mesmo erro.

também coloquei no desktop e continou dando erro

Lucas_Cavalcanti

vc ainda não viu o xml gerado, né? tenta ver isso, que é mais fácil entender o que está acontecendo.

vasilvei

Não consegui retornar o xml, na verdade não sei como enviar um objeto pela url…

uma coisa que estava a versão do vraptor que tenho ele espera mais um parametro um

aqui:

public CustomXStreamXMLDeserializer(ParameterNameProvider provider) {
		super(provider, null);
	}

eu estou passando null

eu tentei fazer isso:

public CustomXStreamXMLDeserializer(ParameterNameProvider provider, XStreamBuilder builder) {
		super(provider, builder);
	}

e dá esse erro ao iniciar a apl web.

19:34:07,262 WARN  [org.springframework.web.context.request.FacesRequestAttributes] (MSC service thread 1-2) Could not register destruction callback [org.springframework.beans.factory.support.DisposableBeanAdapter@1880573] for attribute 'messageConverter' because FacesRequestAttributes does not support such callbacks
19:34:07,265 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/CP]] (MSC service thread 1-2) Exception starting filter vraptor: java.lang.UnsupportedOperationException
	at java.util.AbstractMap.put(AbstractMap.java:203) [rt.jar:1.7.0_03]

.....

19:34:07,305 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-2) Error filterStart
19:34:07,305 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-2) Context [/CP] startup failed due to previous errors
19:34:07,327 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC00001: Failed to start service jboss.web.deployment.default-host./CP: org.jboss.msc.service.StartException in service jboss.web.deployment.default-host./CP: JBAS018040: Failed to start context
	at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:95)
	at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
	at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [rt.jar:1.7.0_03]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [rt.jar:1.7.0_03]
	at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_03]
Lucas_Cavalcanti

acho que não é só esse o erro que tá acontecendo…

na versão do vraptor que vc tá, vc não deveria sobrescrever o Serialization, e sim o XStreamBuilder, que tem os mesmos métodos protected que esse.

vasilvei

dessa forma que você diz:

package br.com.coliseu.util;

import br.com.caelum.vraptor.deserialization.XStreamXMLDeserializer;
import br.com.caelum.vraptor.http.ParameterNameProvider;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class XStreamBuilder extends XStreamXMLDeserializer{

	public XStreamBuilder(ParameterNameProvider provider,
			br.com.caelum.vraptor.serialization.xstream.XStreamBuilder builder) {
		super(provider, builder);
		// TODO Auto-generated constructor stub
	}

	
	
	@Override
	protected XStream getXStream() {
		XStream xstream = new XStream(new DomDriver());
		xstream.registerConverter(new LocalDateTimeConverter());
		xstream.alias("versaotabelas", br.com.coliseu.model.Versaotabelas.class);
		return xstream;
	}

}

depois que eu fiz dessa forma ele deu classnotfound daí eu add a lib xmlpull_1_1_3_1.jar e ele começou a dar esse erro:

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/CP]] (http--127.0.0.1-8080-1) Unhandled exception occurred whilst decorating page: com.thoughtworks.xstream.io.StreamException: Cannot create XmlPullParser
	at com.thoughtworks.xstream.io.xml.AbstractXppDriver.createReader(AbstractXppDriver.java:56) [xstream-1.4.2.jar:]
	at com.thoughtworks.xstream.io.xml.AbstractXppDriver.createReader(AbstractXppDriver.java:65) [xstream-1.4.2.jar:]

...

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/CP].[default]] (http--127.0.0.1-8080-1) Servlet.service() for servlet default threw exception: com.thoughtworks.xstream.io.StreamException: Cannot create XmlPullParser
	at com.thoughtworks.xstream.io.xml.AbstractXppDriver.createReader(AbstractXppDriver.java:56) [xstream-1.4.2.jar:]
vasilvei

Eu tinha esquecido de fazer a anotação

@ApplicationScoped
@Component
public class XStreamBuilder extends XStreamXMLDeserializer{

mas agora deu erro de antes:

09:53:38,506 WARN  [org.springframework.web.context.request.FacesRequestAttributes] (MSC service thread 1-6) Could not register destruction callback [org.springframework.beans.factory.support.DisposableBeanAdapter@1d8bd60] for attribute 'messageConverter' because FacesRequestAttributes does not support such callbacks
09:53:38,508 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/CP]] (MSC service thread 1-6) Exception starting filter vraptor: java.lang.UnsupportedOperationException
	at java.util.AbstractMap.put(AbstractMap.java:203) [rt.jar:1.7.0_03]


....


09:53:38,553 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-6) Error filterStart
09:53:38,553 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-6) Context [/CP] startup failed due to previous errors
09:53:38,574 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-6) MSC00001: Failed to start service jboss.web.deployment.default-host./CP: org.jboss.msc.service.StartException in service jboss.web.deployment.default-host./CP: JBAS018040: Failed to start context
	at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:95)
Lucas_Cavalcanti

não existem caused by’s na stacktrace?

ou pelo menos não aparece alguma classe sua nela?

vasilvei

Lucas!

Na minha aplicação web eu uso tudo via json, qual o melhor para fazer a comunicação do desktop via xml ou json, porque eu tenho um serialization json e quando eu faço um post
de LocalDateTime funciona perfeitamente, o que eu teria que fazer para usar json

nessa parte aqui:?

restfulie = Restfulie.custom();
        restfulie.getMediaTypes().register(new XmlMediaType().withTypes(Grupo.class, Produto.class, Item.class, Versaotabelas.class));

eu preciso dessa anotação nas classes se for usar json:

@XStreamAlias("versaopdvs")

A minha CustomXStreamJSONSerialization que funciona na parte web

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.coliseu.util;


import javax.servlet.http.HttpServletResponse;

import br.com.caelum.vraptor.interceptor.TypeNameExtractor;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.serialization.ProxyInitializer;
import br.com.caelum.vraptor.serialization.xstream.XStreamBuilder;
import br.com.caelum.vraptor.serialization.xstream.XStreamJSONSerialization;

import com.thoughtworks.xstream.XStream;


/**
 * Classe utlizada para converter data do tipo date para LocalDate, quando
 * chama as funções json
 * @author valde
// */



@Component
public class CustomXStreamJSONSerialization extends XStreamJSONSerialization {

  

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

	@Override
    protected XStream getXStream() {
        XStream stream = super.getXStream();
        stream.registerConverter(new LocalDateConverter());
        stream.registerConverter(new LocalDateTimeConverter());
        return stream;
    }
	
	
}
Lucas_Cavalcanti

troca o new XmlMediaType por new JsonMediaType

ou use xml do lado do vraptor também

vasilvei

Lucas eu sei que estou sendo chato cara, mas se por gentileza puder me dar uma ajuda, vou te explicar como esta o meu projeto.

Obs: estou fazendo novamente tudo em xml.

se eu mando um objeto que tem Atributo LocalDateTime da apl. web para desktop vai de boa.

quando eu mando um objeto do desktop para web via post, que não tem objeto LocalDateTime vai de boa. se for com LocalDateTime preenchido dá esse pau:

14:17:10,275 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/CP]] (http--127.0.0.1-8080-1) Unhandled exception occurred whilst decorating page: com.thoughtworks.xstream.io.StreamException:  : Element type "org.joda.time.chrono.ISOChronology" must be followed by either attribute specifications, ">" or "/>".
	at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:86) [xstream-1.3.1.jar:]
	at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:70) [xstream-1.3.1.jar:]
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:861) [xstream-1.3.1.jar:]
	at br.com.caelum.vraptor.deserialization.XStreamXMLDeserializer.deserialize(XStreamXMLDeserializer.java:58) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.DeserializingInterceptor.intercept(DeserializingInterceptor.java:87) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88) [vraptor-3.4.1.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.10.Final.jar:]
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) [sitemesh-2.4.1.jar:]
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) [sitemesh-2.4.1.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.10.Final.jar:]
	at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:154) [jboss-as-web-7.1.0.Final.jar:7.1.0.Final]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.10.Final.jar:]
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.10.Final.jar:]
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.10.Final.jar:]
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.10.Final.jar:]
	at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_03]
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1782; Element type "org.joda.time.chrono.ISOChronology" must be followed by either attribute specifications, ">" or "/>".
	at org.apache.xerces.parsers.DOMParser.parse(DOMParser.java:244)
	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:285)
	at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:79) [xstream-1.3.1.jar:]
	... 47 more

14:17:10,310 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/CP].[default]] (http--127.0.0.1-8080-1) Servlet.service() for servlet default threw exception: com.thoughtworks.xstream.io.StreamException:  : Element type "org.joda.time.chrono.ISOChronology" must be followed by either attribute specifications, ">" or "/>".
	at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:86) [xstream-1.3.1.jar:]
	at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:70) [xstream-1.3.1.jar:]
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:861) [xstream-1.3.1.jar:]
	at br.com.caelum.vraptor.deserialization.XStreamXMLDeserializer.deserialize(XStreamXMLDeserializer.java:58) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.DeserializingInterceptor.intercept(DeserializingInterceptor.java:87) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58) [vraptor-3.4.1.jar:]
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88) [vraptor-3.4.1.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.10.Final.jar:]
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) [sitemesh-2.4.1.jar:]
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) [sitemesh-2.4.1.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.10.Final.jar:]
	at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:154) [jboss-as-web-7.1.0.Final.jar:7.1.0.Final]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.10.Final.jar:]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.10.Final.jar:]
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.10.Final.jar:]
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.10.Final.jar:]
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.10.Final.jar:]
	at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_03]
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1782; Element type "org.joda.time.chrono.ISOChronology" must be followed by either attribute specifications, ">" or "/>".
	at org.apache.xerces.parsers.DOMParser.parse(DOMParser.java:244)
	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:285)
	at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:79) [xstream-1.3.1.jar:]
	... 47 more

eu subscrevi o XStreamBuilder, na apl. web, ele passa por aqui quando estou debugando, eu coloquei o “ISO-8859-1”, porque estava dando : Invalid byte 2 of 4-byte UTF-8 sequence.

package br.com.coliseu.util;

import br.com.caelum.vraptor.deserialization.XStreamXMLDeserializer;
import br.com.caelum.vraptor.http.ParameterNameProvider;
import br.com.caelum.vraptor.ioc.Component;
import br.com.coliseu.model.Versaotabelas;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
@Component
public class XStreamBuilder extends XStreamXMLDeserializer {

	public XStreamBuilder(ParameterNameProvider provider, br.com.caelum.vraptor.serialization.xstream.XStreamBuilder builder) {
		super(provider, builder);
	}


/*	  Extension point to configure your xstream instance.
	  @return the configured xstream instance
*/
	 
	@Override
	protected XStream getXStream() {
		XStream xStream = new XStream(new DomDriver("ISO-8859-1"));
		xStream.processAnnotations(new Class[] {Versaotabelas.class});
		xStream.registerConverter(new LocalDateConverter());
		xStream.registerConverter(new LocalDateTimeConverter());
		return xStream;
	}

}

Apl. web:

@Post
	@Path("atualizaatualizaItemPostItem")
	@Consumes("application/xml")
	public void atualizaItemPost(Versaotabelas versaotabelas) {

Apl. Desktop:

Versaotabelas versaotabelas = respositoryVersaotabelas.dateItem(2);
         //versaotabelas.setDttimealter(null);
    
        Response responseData = restfulie.at("http://localhost:8080/CP/comunicador/atualizaatualizaItemPostItem")
                .accept("application/xml").as("application/xml").post(versaotabelas);
Lucas_Cavalcanti

na api desktop vc tá registrando o converter das datas também?

vasilvei

Para registrar no desktop é dessa forma, igual ao de web

package br.com.coliseu.util;  
  
import br.com.caelum.vraptor.deserialization.XStreamXMLDeserializer;  
import br.com.caelum.vraptor.http.ParameterNameProvider;  
import br.com.caelum.vraptor.ioc.Component;  
import br.com.coliseu.model.Versaotabelas;  
  
import com.thoughtworks.xstream.XStream;  
import com.thoughtworks.xstream.io.xml.DomDriver;  
@Component  
public class XStreamBuilder extends XStreamXMLDeserializer {  
  
    public XStreamBuilder(ParameterNameProvider provider, br.com.caelum.vraptor.serialization.xstream.XStreamBuilder builder) {  
        super(provider, builder);  
    }  
  
  
/*    Extension point to configure your xstream instance. 
      @return the configured xstream instance 
*/  
       
    @Override  
    protected XStream getXStream() {  
        XStream xStream = new XStream(new DomDriver("ISO-8859-1"));  
        xStream.processAnnotations(new Class[] {Versaotabelas.class});  
        xStream.registerConverter(new LocalDateConverter());  
        xStream.registerConverter(new LocalDateTimeConverter());  
        return xStream;  
    }  
  
}
vasilvei

Eu registrei também aqui

restfulie.getMediaTypes().register(new XmlMediaType().withTypes(Grupo.class, Produto.class, Item.class, Versaotabelas.class, LocalDateTimeConverter.class));

Mas continua dando:

lement type "org.joda.time.chrono.ISOChronology" must be followed by either attribute specifications, ">" or "/>".

15:26:28,193 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/CP]] (http--127.0.0.1-8080-1) Unhandled exception occurred whilst decorating page: com.thoughtworks.xstream.io.StreamException:  : Element type "org.joda.time.chrono.ISOChronology" must be followed by either attribute specifications, ">" or "/>".
	at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:86) [xstream-1.3.1.jar:]
	at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:70) [xstream-1.3.1.jar:]
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:861) [xstream-1.3.1.jar:]
....
Lucas_Cavalcanti

não é assim que registra o converter no restfulie…

vc precisa customizar o xstream de dentro…

restfulie.getMediaTypes().register(new XmlMediaType() {
   {withTypes(Grupo.class, Produto.class, Item.class, Versaotabelas.class)}

   @Override
   protected void configure(XStream xstream) {
      //registre o cara aqui.
   }
});
vasilvei

Então fiz isso no Desktop:

restfulie = Restfulie.custom();
        
        
        restfulie.getMediaTypes().register(new XmlMediaType() {  
            {withTypes(Grupo.class, Produto.class, Item.class, Versaotabelas.class);}  

            @Override  
            protected void configure(XStream xstream) {  
               //registre o cara aqui.  
                xstream.registerConverter(new LocalDateConverter());
		xstream.registerConverter(new LocalDateTimeConverter());
            }  
         });

ele chama o LocalDAteTimeConverter agora do desktop:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.arena.resources;

import org.joda.time.LocalDateTime;
import org.joda.time.format.DateTimeFormat;

import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;

/**
 * Classe utilizada para converter datas
 * @author valde
 */
public class LocalDateTimeConverter extends AbstractSingleValueConverter {


	@Override
	public boolean canConvert(Class type) {
		return LocalDateTime.class.equals(type);
    }

    @Override
    public String toString(Object obj) {
        try {

        return DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").print((LocalDateTime) obj);
        } catch (Exception e) {
            return "ERRO";
        }

    }
    @Override
    public Object fromString(String string) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}

e chama a parte web.

passando aqui:

package br.com.coliseu.util;

import br.com.caelum.vraptor.deserialization.XStreamXMLDeserializer;
import br.com.caelum.vraptor.http.ParameterNameProvider;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.serialization.xstream.XStreamBuilder;
import br.com.coliseu.model.Versaotabelas;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

@Component
public class CustomXStreamBuilder extends XStreamXMLDeserializer {

	/*  Extension point to configure your xstream instance.
	  @return the configured xstream instance*/

	 
	public CustomXStreamBuilder(ParameterNameProvider provider, XStreamBuilder builder) {
		super(provider, builder);
		// TODO Auto-generated constructor stub
	}

	@Override
	protected XStream getXStream() {
		XStream xStream = new XStream(new DomDriver("ISO-8859-1"));
		xStream.processAnnotations(new Class[] {Versaotabelas.class});
		xStream.registerConverter(new LocalDateConverter());
		xStream.registerConverter(new LocalDateTimeConverter());
		return xStream;
	}

}

daí dá esse erro:

17:58:21,557 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/CP]] (http--127.0.0.1-8080-1) Unhandled exception occurred whilst decorating page: com.thoughtworks.xstream.converters.ConversionException: Not supported yet. : Not supported yet.
---- Debugging information ----
message             : Not supported yet.
cause-exception     : java.lang.UnsupportedOperationException
cause-message       : Not supported yet.
class               : br.com.coliseu.model.Versaotabelas
required-type       : org.joda.time.LocalDateTime
path                : /versaotabelas/dttimealter
-------------------------------
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89) [xstream-1.3.1.jar:]

...
Lucas_Cavalcanti

deve ser por causa disso :wink:

@Override  
    public Object fromString(String string) {  
        throw new UnsupportedOperationException("Not supported yet.");  
    }
vasilvei

Perfeito, foi falta de atenção minha, Valeu ai Lucas, tudo certo agora.

@Override
    public Object fromString(String string) {
    	DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
    	return LocalDateTime.parse(string, fmt);

    }
Criado 29 de agosto de 2012
Ultima resposta 1 de set. de 2012
Respostas 30
Participantes 2