Boa noite.
Tenho uma aplicaçãozinha com Seam e até agora todas minhas validações estavam sendo feitas diretamente pelo hibernate validator através de anotações em minhas entities. Agora precisei fazer uma validação programaticamente direto na Action. Quando ocorre o erro, ele exibe a mensagem de erro corretamente, porém ele perde os dados digitados pelo usuário no fomulário. Quando ocorre algum erro simples de validação (@NotNull por exemplo) ele volta para o formulário com os dados preenchidos certinhos, o problema é na validação manual mesmo.
Meu form no xhtml está assim:
..
<h:form id="formUsuario" styleClass="edit">
<s:validateAll>
<rich:panel>
<f:facet name="header">
<h:outputText value="#{messages[usuarioAction.keyLabelAct]}" />
</f:facet>
<s:decorate id="loginField" template="../layout/edit.xhtml">
<ui:define name="label">#{messages['label.login']}</ui:define>
<h:inputText value="#{usuarioAction.usuario.login}" id="txtLogin" required="true" size="15" />
</s:decorate>
<s:decorate id="nomeField" template="../layout/edit.xhtml">
<ui:define name="label">#{messages['label.nome']}</ui:define>
<h:inputText value="#{usuarioAction.usuario.nome}" id="txtNome" required="true" size="30" />
</s:decorate>
<s:decorate id="perfilField" template="../layout/edit.xhtml">
<ui:define name="label">#{messages['label.perfil']}</ui:define>
<h:selectOneMenu id="selectPerfil" value="#{usuarioAction.usuario.perfil}" required="true"
converter="#{usuarioAction.converterPerfil}">
<s:selectItems var="perfil" value="#{usuarioAction.perfis}" label="#{perfil.nome}"
noSelectionLabel="#{messages['label.selecione']}"/>
</h:selectOneMenu>
</s:decorate>
<div style="clear:both">
<span class="required">*</span>
#{messages['label.camposObrigatorios']}
</div>
</rich:panel>
<div class="actionButtons">
<h:commandButton action="#{usuarioAction.add}" id="btnAdd" value="#{messages['label.incluir']}"
rendered="#{usuarioAction.act eq 'incluir'}"/>
<h:commandButton action="#{usuarioAction.update}" id="btnUpdate" value="#{messages['label.alterar']}"
rendered="#{usuarioAction.act eq 'alterar'}"/>
<h:commandButton action="#{usuarioAction.remove}" id="btnRemove" value="#{messages['label.excluir']}"
rendered="#{usuarioAction.act eq 'excluir'}"/>
<s:button view="/usuario/list.xhtml" value="#{messages['label.cancelar']}" id="btnCancel" propagation="end"/>
</div>
</s:validateAll>
</h:form>
...
Minha Action:
...
@Name("usuarioAction")
public class UsuarioAction extends BaseAction {
private Usuario usuario = new Usuario();
@In("#{usuarioService}")
private UsuarioService usuarioService;
@In("#{perfilService}")
private PerfilService perfilService;
@In
private FacesMessages facesMessages;
private EntidadeComIdConverter<Perfil> converterPerfil;
private List<Perfil> perfis;
@Begin(join = true)
public String loadUsuario() {
if(usuario != null && usuario.getIdUsuario() != null &&
(getAct().equals(ACTION_ALTERAR) || getAct().equals(ACTION_EXCLUIR))) {
usuario = usuarioService.findById(usuario.getIdUsuario());
if(usuario == null) {
facesMessages.add(FacesMessage.SEVERITY_ERROR, "#{messages['label.usuario.naoEncontrado']}");
return NOT_FOUND;
}
} else {
usuario = new Usuario();
}
return SUCCESS;
}
@End
public String add() {
if(usuarioService.existeUsuarioComLogin(usuario.getLogin())) {
facesMessages.addToControl("txtLogin", "#{messages['erro.existe.usuario.login']}");
return null;
}
usuarioService.add(usuario);
facesMessages.add("#{messages['label.usuario.inserido']}");
usuario = new Usuario();
return SUCCESS;
}
..
E minhas regras de navegação
<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.1.xsd">
<param name="idUsuario" value="#{usuarioAction.usuario.idUsuario}"/>
<param name="act" value="#{usuarioAction.act}"/>
<action execute="#{usuarioAction.loadUsuario}"/>
<navigation>
<rule if-outcome="notFound">
<redirect view-id="/usuario/list.xhtml"/>
</rule>
</navigation>
<navigation from-action="#{usuarioAction.add}">
<rule if-outcome="success">
<redirect view-id="/usuario/list.xhtml"/>
</rule>
</navigation>
<navigation from-action="#{usuarioAction.update}">
<redirect view-id="/usuario/list.xhtml"/>
</navigation>
<navigation from-action="#{usuarioAction.remove}">
<redirect view-id="/usuario/list.xhtml"/>
</navigation>
</page>
Alguém tem idéia do que pode ser?Já tentei várias coisas, mas todas sem sucesso.
Desde já obrigado
Luciano