Seam Validation losing state
lucianom86 Sep 9, 2009 3:55 PMGood Morning,
I have a little application using Seam and until now all my validations had been done directly by hibernate validator using anotations in my entities. Now i need to do a validation programatically in the Action. When the error occours, the error message is displayed correctly, but it loses the data informed by the user in the form. When occours some simple validation error (@NotNull for example) it comes back to the form with the data filled correctly, the problem is with the manual validation.
My form on xhtml looks like this
`
<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>
...
`
My 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;
}
..
`
My navigation rules:
<?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>
Can someone figure out what can be causing the problem?I've already tried many thins, but no success.
Thanks,
Luciano
Ps.: Sorry for the english and for the text formating.
I have a little application using Seam and until now all my validations had been done directly by hibernate validator using anotations in my entities. Now i need to do a validation programatically in the Action. When the error occours, the error message is displayed correctly, but it loses the data informed by the user in the form. When occours some simple validation error (@NotNull for example) it comes back to the form with the data filled correctly, the problem is with the manual validation.
My form on xhtml looks like this
`
<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>
...
`
My 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;
}
..
`
My navigation rules:
<?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>
Can someone figure out what can be causing the problem?I've already tried many thins, but no success.
Thanks,
Luciano
Ps.: Sorry for the english and for the text formating.