Serialização personalizada XStream Vraptor [RESOLVIDO]

7 respostas
thinet

E ai galera, então estou com um problema para integrar o Fusion Charts com o vraptor.

Os gráficos gerados pela ferramenta necessitam que as tags do xml saim com essas informações:

<chart caption="Not Started"> <set label="Not Started" value="25"/> <set label="Started" value="50"/> <set label="In Between" value="25"/> </chart>

Pesquisando eu vi que XSTream me permite fazer isso conforme esse blog:

http://liyaqatm.wordpress.com/2010/01/26/xstream-basic-introduction/

A minha pergunta é, como eu poderia utilizar essas funções do XSTream dentro do serializador do Vraptor?

Valeu

7 Respostas

Lucas_Cavalcanti

você pode usar as anotações do XStream na sua classe e o VRaptor vai usá-las automaticamente…

@XStreamAttribute
private String label;

@XStreamAttribute
private Integer value;

ou algo do tipo

thinet

valeu lucas, vou tentar e posto o resultado!

thinet

Ae galera só para registrar caso alguem necessite de usar o vraptor com o fusion charts segue o que eu fiz:

Gráfico gerado: PIE3D

Configs:

Vraptor blank project
Anotações xstream

na minha view apenas adicionei essa chamada:

<div id="chartContainer">FusionCharts will load here!</div>
	<script type="text/javascript">
		var myChart = new FusionCharts("<c:url value="/grafico/FCF_Pie3D.swf" />", "myChartId", "400", "300",  "1", "0");
		myChart.setDataURL("<c:url value="/chart.xml" />", "xml");
		myChart.render("chartContainer");
	</script>

No meu controller eu fiz assim:

@Get("/chart.xml")
	public void getXML(){
		
		logger.debug("** REQUISIÇÃO CONTROLLER XML **");
		
		if(Validation.isValid(chartElements)){		
			this.result.use(Results.xml()).from(this.chartElements)
			                              .include("labels").serialize();			
		}else{
			this.result.include("message", "chartError");
			this.result.redirectTo(PanelController.class).panel();
		}
	}

E as classes que geraram o gráfico:

@XStreamAlias(value = "graph")
public class PieChart implements ChartElements{
	
	@XStreamAsAttribute
	private String caption;
	
	@XStreamImplicit
	private List<PieChartSet> labels = new ArrayList<PieChartSet>();

	public PieChart(String caption) {
		this.caption = caption;		
	}

	public void add(PieChartSet pieChartSet) {
		labels.add(pieChartSet);
	}

	public String getCaption() {
		return caption;
	}
}

// classe que fica tageada pelo xstrem
@XStreamAlias(value = "set")
public class PieChartSet {
	@XStreamAsAttribute
	private String label;
	
	@XStreamAsAttribute
	private String name;
	
	@XStreamAsAttribute
	private String value;
	
	public PieChartSet(String label, String name, String value) {
		this.label = label;
		this.name = name;
		this.value = value;
	}
	
	public String getLabel() {
		return label;
	}
	public String getValue() {
		return value;
	}

	public String getName() {
		return name;
	}

Tomem cuidado no tipo de gráfico gerado, pois pode rolar um no data display por conta disso.

Essas classes ai geram esse xml (que é aceito pelo pie3D)

<graph caption="Not Started"><set label="Not Started" name="prod1" value="25"/><set label="Started" name="prod2" value="50"/><set label="In Between" name="prod3" value="25"/></graph>

valeu Lucas !!!

D

Estou tentando fazer funcionar fusion com vraptor só são entendi essa parte:

public class PieChart implements ChartElements{

Como ficou a classe ChartsElements implementada pela PieCharts?

thinet

danielpx:
Estou tentando fazer funcionar fusion com vraptor só são entendi essa parte:

public class PieChart implements ChartElements{

Como ficou a classe ChartsElements implementada pela PieCharts?

Então cara, no meu Controller ai em cima eu queria passar vários tipos de gráficos, nesse exemplo eu usei pieChart, porém o serializador não deve ser específico de uma classe, portanto eu criei uma interface apenas de marcação, o xstream é inteligente para pegar o tipo certo e eu fico com um controller que gera o xml recebendo qualquer
classe que implemente pieChartElements, sacou?

Qualquer coisa posta ai sua dúvida!

D

Ok. vou ver se consigo fazer.

Obrigado

D

Cara , não consegui fazer ainda, tem como vc postar sua classe ChartElements pra eu ver onde to errando.

Obrigado

Criado 18 de junho de 2011
Ultima resposta 30 de ago. de 2011
Respostas 7
Participantes 3