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<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2><s:text name="i18n.cadastroUsuarios"></s:text></h2>
<s:form namespace="/cadastro" action="usuario!gravar" validate="true">
<s:textfield name="email" key="i18n.email"/>
<s:textfield name="senha" key="i18n.senha"/>
<s:submit name="btn_submit" key="i18n.salvar"/>
</s:form>
actionmessage:<s:actionmessage/><br>
fielderror:<s:fielderror/><br>
actionerror:<s:actionerror/>
<h2><s:text name="i18n.usuarios"/></h2>
<table border="1">
<s:iterator value="usuarios">
<tr id="row_<s:property value="id"/>">
<td>
<s:property value="email" />
</td>
<td>
<s:property value="senha" />
</td>
<td>
<s:url id="excluirUrl" namespace="/cadastro" action="usuario" method="excluir">
<s:param name="id" value="id" />
</s:url>
<s:a href="%{excluirUrl}"><s:text name="i18n.excluir"/></s:a>
<s:a id="a_%{id}"><s:text name="i18n.alterar"/></s:a>
</td>
</tr>
</s:iterator>
</table>
</body>
</html>
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<UsuarioDTO> {
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<UsuarioDTO> getUsuarios() {
LOG.info("UsuarioAction.getUsuarios()");
return this.service.findAll();
}
@Override
public UsuarioDTO getModel() {
LOG.info("UsuarioAction.getModel()");
return usuarioDTO;
}
}
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<constant name="struts.convention.classes.reload" value="true" />
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.convention.action.packages" value="br.com.web.actions"/>
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.convention.default.parent.package" value="default"/>
<package name="default" namespace="/" extends="struts-default"/>
</struts>
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;
}
}