Struts 2 Redirecionar Objeto para outra Action

11 respostas
reginaldo.mh

Alguem pode me falar como eu redireciono um objeto de uma Action Struts 2 para outra??

Eu já tentei fazer assim :

@Action(value="boletosGerar" ,results={
		@Result(name="ok", type="redirectAction", params={"actionName", "boletosNovosListar","boletos","${boletos}"})}
	 )

e Assim:

HttpServletRequest request = ServletActionContext.getRequest();  
		request.setAttribute("boletos",boletos);

Mas não funciona, o codigo até executa, mas o objeto não vai para a outra action.

Por favor ajudem,
Valeu!

11 Respostas

jyoshiriro

Eu acredito que o erro esteja no segundo código.

Para passar valores nos redirecionamento use getters públicos. Fica estranho usar “request” no Struts2 que foi feito justamente para abstrair boa parte disso. Em todo caso, se por força maior vocÇe tiver que usar isso, dê um jeito de disponibilizar o mesmo valor via get público, ok?

reginaldo.mh

Nas minhas 2 actions eu disponibilizei getters and setters públicos e nada… :frowning:
O engraçado é que se eu redireciono para uma JSP funciona…

von.juliano

A segunda opção não funciona mesmo. Quanto à primeira, você só precisa assegurar que a “action de partida” tenha o método getBoletos, e a “de destino” tenha o setBoletos.

Posta aqui as duas actions pra gente poder ver melhor.

Flw! :thumbup:

jyoshiriro

É exatamente como o colega acima falou.

reginaldo.mh

Vamos lá
1a action :

public class BoletosGerarAction {
	private Calendar dtInicial;
	private Calendar dtFinal;
	private List<Boleto> boletos = new ArrayList<Boleto>();
	
	@Action(value="boletosGerar" ,results={
		@Result(name="ok", type="redirectAction", params={"actionName", "boletosNovosListar"})}
	 )
	public String execute() {
			
		List<Contrato> contratos = new ContratoDAO().getContratosVencendo(dtInicial,dtFinal);
		String nossoNumero;
		String licenca;
		
		for(Contrato contrato : contratos){
		   Boleto boleto = new Boleto();
		    Calendar vencimento = contrato.getDtVencimento();
		   boleto.setVencimento(vencimento);
		   		   
		   licenca = String.valueOf(contrato.getLicenca());
		   SimpleDateFormat formatador = new SimpleDateFormat("ddMM");
		   nossoNumero ="82"+ formatador.format(vencimento.getTime()) + licenca.substring(licenca.length()-4);
		   boleto.setNossoNumero(nossoNumero);	   
  
		   boleto.setContratoCodigo(contrato.getCodigo());
		   boleto.setData(new Date());
		   boleto.getStatus().setCodigo(1);
		   boleto.setPeriodo(contrato.getPagamento().getPeriodo());
		   boleto.setValor( contrato.getValor());
		   boletos.add(boleto);
		}
		//new BoletoDAO().adicionar(boletos);  
		System.out.println("1a Action tamanho boletos: "+boletos.size());
		return "ok";
	}

	public void setDtInicial(Calendar dtInicial) {
		this.dtInicial = dtInicial;
	}
	public void setDtFinal(Calendar dtFinal) {
		this.dtFinal = dtFinal;
	}
	public List<Boleto> getBoletos() {
		return boletos;
	}
	public void setBoletos(List<Boleto> boletos) {
		this.boletos = boletos;
	}
	
}

2a Action :

public class BoletosNovosListarAction {
	private List<Boleto> boletos = new ArrayList<Boleto>() ;
	
	@Action(value="boletosNovosListar" ,results={
			@Result(name="ok", type="httpheader", params={"status", "200"})}
	 )
	public String execute() {
		
		System.out.println("2a action Tamanho boletos: "+boletos.size());
	
		for(Boleto boleto : boletos){
			 System.out.println("codigo "+boleto.getCodigo());
		}		
		return "ok";
	}
	public List<Boleto> getBoletos() {
		return boletos;
	}
	public void setBoletos(List<Boleto> boletos) {
		this.boletos = boletos;
	}
}

Resultado no console:

1a Action tamanho boletos: 3
2a action Tamanho boletos: 0

jyoshiriro

Ah… agora que entendi! queres passar um objeto complexo. Isso não pode. Pode passar só objetos “simples”. Imagine que o Struts2 “monta” uma URL e redireciona. Numa URL você não pode passar nada além de parâmetros simples, certo? Então. No “redirectAction” é a mesma coisa.

reginaldo.mh

Isso, por isso tentei usar o setAtributte, eu consigo pendurar objetos em request com ele…
mas parece que o struts dificulta um pouco. Será que não tem jeito mesmo?
Será que essa URL que o RedirectAction num porder ter a referencia do Objeto ou coisa assim?
tem que ter um jeito…rs

jyoshiriro

Mas via request não funcionou porque é feito um redirecionamento, ou seja, não é o mesmo request. Se você usar um analizador de requisção (um FireBug da vida) vai ver q são feitos 2 requisições rapidinho, dai parece 1.

Podes tentar via “chain”, já tentou?

reginaldo.mh

Não tentei… o que me faz achar que existe uma solução mais simples é que se eu redireciono a 1a action para uma JSP

@Action(value="boletosGerar" ,results={
		@Result(name="ok", location="/listaBoletos.jsp")}
	 )

JSP

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<table>
	<c:forEach items="${boletos}" var="boleto">
				<tr>
					<td>${boleto.nossoNumero}</td>
				</tr>
	</c:forEach>
</table>

Vou ter como resposta :

<table>
	<tr>
		<td>[telefone removido]</td>
	</tr>
	<tr>
	    <td>[telefone removido]</td>
	</tr>
	<tr>
	     <td>[telefone removido]</td>
	</tr>
	
</table>

Do mesmo jeito que essa JSP recebe o objeto boletos eu quero que minha 2a action receba…

reginaldo.mh

Mais ninguem pode ajudar??

von.juliano

O problema é que o XWorkConverter não consegue converter a lista quando ela deve ser passada para a outra action, já que ela é passada como uma String no request, chamando o toString da lista, assim o converter simplesmente não sabe o que fazer na hora de remontá-la, retornando ognl.NoConversionPossible.

Não sei a solução pra isso amigo. Caso você descubra, compartilhe com a gente, porque essa é complicada. :frowning:

Criado 10 de dezembro de 2010
Ultima resposta 10 de dez. de 2010
Respostas 11
Participantes 3