Struts2 + ModelDriven = problema com addActionMessage

1 resposta
klaiddias

Colegas, tenho uma aplicação que estava funcionando perfeitamente, a action após gravar o registro no banco de dados retornava uma mensagem para o usuário atravez do método addActionMessage, após implementar a interface ModelDriven e sobrescrever o metodo getModel() as tags do struts <s:actionmessage/>, <s:fielderror/> e <s:actionerror/> pararam de funcionar, se remover a implementação do ModelDriven tudo volta a funcionar.

Estou utilizando o metodo getModel() para fazer o parse da Action para a Entity e entregar para o hibernate(autoMAGICAMENTE), antes estava criando um metodo manualmente que instanciava um objeto da minha classe Entity setava os valores um a um e entregava para o novo objeto para o hibernate.

Alguém pode me ajudar a descobrir porque o ModelDriven está impedindo que eu obtenha o um actionmessage no jsp?
Pelo que já pesquisei, está relacionado com o stack de interceptores, más, em todas as minhas tentativas nada funcionou, estou a dias estudando o que pode ser a nada.

Grato a todos.

usuario.jsp
&lt;%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%&gt;
    &lt;%@taglib prefix="s" uri="/struts-tags" %&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
&lt;title&gt;Insert title here&lt;/title&gt;

&lt;/head&gt;
&lt;body&gt;
&lt;h2&gt;&lt;s:text name="i18n.cadastroUsuarios"&gt;&lt;/s:text&gt;&lt;/h2&gt;

	&lt;s:form namespace="/cadastro" action="usuario!gravar" validate="true"&gt;
       &lt;s:textfield name="email" key="i18n.email"/&gt;
       &lt;s:textfield name="senha" key="i18n.senha"/&gt;
       &lt;s:submit name="btn_submit" key="i18n.salvar"/&gt;
	&lt;/s:form&gt;
      
       actionmessage:&lt;s:actionmessage/&gt;<br>
       fielderror:&lt;s:fielderror/&gt;<br>
       actionerror:&lt;s:actionerror/&gt;	
&lt;h2&gt;&lt;s:text name="i18n.usuarios"/&gt;&lt;/h2&gt;
    &lt;table border="1"&gt;
        &lt;s:iterator value="usuarios"&gt;
            &lt;tr id="row_&lt;s:property value="id"/&gt;&quot;&gt;
                &lt;td&gt;
                    &lt;s:property value="email" /&gt;
                &lt;/td&gt;
                &lt;td&gt;
                    &lt;s:property value="senha" /&gt;
                &lt;/td&gt;
                &lt;td&gt;
                    &lt;s:url id="excluirUrl" namespace="/cadastro" action="usuario" method="excluir"&gt;
                        &lt;s:param name="id" value="id" /&gt;
                    &lt;/s:url&gt;
                    &lt;s:a href="%{excluirUrl}"&gt;&lt;s:text name="i18n.excluir"/&gt;&lt;/s:a&gt;
                    &lt;s:a id="a_%{id}"&gt;&lt;s:text name="i18n.alterar"/&gt;&lt;/s:a&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/s:iterator&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
UsuarioAciton.java
package br.com.web.actions;

import java.util.List;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.interceptor.validation.SkipValidation;

import br.com.web.dto.UsuarioDTO;
import br.com.web.service.UsuarioService;

import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.validator.annotations.EmailValidator;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator;
import com.opensymphony.xwork2.validator.annotations.Validations;
@Namespace("cadastro")
public class UsuarioAction extends UsuarioDTO implements Preparable, ModelDriven&lt;UsuarioDTO&gt; {
	private static final long serialVersionUID = 8856864734519504058L;
	private UsuarioService service;
	private UsuarioDTO usuarioDTO;

	public UsuarioAction(UsuarioService service) {
		this.service = service;
	}

	@Action(value="/usuario", results={
			@Result(name=SUCCESS, location="/pages/usuario.jsp"),
			@Result(name=INPUT, location="/pages/usuario.jsp")
		}
	)
	@Validations(
			requiredStrings={
					@RequiredStringValidator(fieldName="email", key="campo_requerido", trim=true),
					@RequiredStringValidator(fieldName="senha", key="campo_requerido", trim=true)
			},
			emails={
					@EmailValidator(fieldName="email", key="campo_invalido")
			},
			stringLengthFields={
					@StringLengthFieldValidator(fieldName="senha", minLength="6", maxLength="20", trim=true, key="campo_min6_max20")
			}
	)
	
	@SkipValidation
	public String execute(){
		return SUCCESS;
	}

	@Override
	public void prepare() throws Exception {
		LOG.info("UsuarioAction.prepare()");  
		usuarioDTO = new UsuarioDTO();
	}
	
	public String gravar(){
		LOG.info("UsuarioAction.gravar()");
		//this.service.gravar(usuarioDTO);
		this.addActionMessage("Dados gravados com sucesso.");
		return SUCCESS;
	}
	
	@SkipValidation
	public String excluir(){
		LOG.info("UsuarioAction.excluir()");
		this.service.remover(usuarioDTO.getId());
		addActionMessage("Dados removidos com sucesso.");
		return SUCCESS;
	}
	
	public List&lt;UsuarioDTO&gt; getUsuarios() {
		LOG.info("UsuarioAction.getUsuarios()");
		return this.service.findAll();
	}

	@Override
	public UsuarioDTO getModel() {
		LOG.info("UsuarioAction.getModel()");
		return usuarioDTO;
	}
}
struts.xml
&lt;!DOCTYPE struts PUBLIC  
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
"http://struts.apache.org/dtds/struts-2.0.dtd"&gt;  

&lt;struts&gt;
	&lt;constant name="struts.devMode" value="true"/&gt;
	&lt;constant name="struts.convention.classes.reload" value="true" /&gt;
	&lt;constant name="struts.enable.DynamicMethodInvocation" value="true" /&gt;
	&lt;constant name="struts.convention.action.packages" value="br.com.web.actions"/&gt;    
	&lt;constant name="struts.objectFactory" value="spring" /&gt;
	&lt;constant name="struts.convention.default.parent.package" value="default"/&gt;
    &lt;package name="default" namespace="/" extends="struts-default"/&gt;
&lt;/struts&gt;
UsuarioDTO.java
package br.com.web.dto;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import com.opensymphony.xwork2.ActionSupport;


@Entity
@Table(name="tb001_cliente")
@SequenceGenerator(name="sq001_cliente", sequenceName="sq001_cliente", allocationSize=1)
public class UsuarioDTO extends ActionSupport {
	private static final long serialVersionUID = -7488327121285508119L;

	@Id
	@Column(name="tb001_id")
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sq001_cliente")
	private Long id;
	
	@Column(name="tb001_email")
	private String email;
	
	@Column(name="tb001_senha")
	private String senha;

	public Long getId() {
		return id;
	}

	public String getEmail() {
		return email;
	}

	public String getSenha() {
		return senha;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}
}

1 Resposta

klaiddias

Pessoal, ainda continuo com o problema, se algum puder me ajudar… seria muito grato.

Criado 8 de setembro de 2011
Ultima resposta 10 de set. de 2011
Respostas 1
Participantes 1