Bom pessoal, pra quem usa o validator do VRaptor, pra checagem server side, e gostaria de uma forma de verificar pontualmente se houve erros por exemplo no nome, na cidade, ou outro campo qualquer, ou gostaria de exibir as mensagem de forma separada ao lado dos campos, segue um componente que modifiquei do VRaptor.
Primeiro a forma de uso
<c:if test="${validatorErrors.notEmpty}">
Ocorreram ${validatorErrors.size} falhas
</c:if>
Login: <input type="text" name="usuario.login" class="${validatorErrors.hasError.login ? 'error-class' : ''}" />
<div class="erro-msg">${validatorErrors.message.login}</div>
Email: <input type="text" name="usuario.email" class="${validatorErrors.hasError.email ? 'error-class' : ''}" />
<div class="erro-msg">${validatorErrors.message.email}</div>
Senha: <input type="text" name="usuario.senha" class="${validatorErrors.hasError.senha ? 'error-class' : ''}" />
<div class="erro-msg">${validatorErrors.message.senha}</div>
Confirmar: <input type="text" name="confir" class="${validatorErrors.hasError.confirmacao ? 'error-class' : ''}" />
<div class="erro-msg">${validatorErrors.message.confirmacao}</div>
Esse exemplo renderizado, quando digita-se um login < que 3 caracters, e quando erra a confirmação de senha.
Ocorreram 2 falhas
Login: <input type="text" name="usuario.login" class="error-class" />
<div class="erro-msg">o login deve ter tamanho entre 3 e 20 </div>
Email: <input type="text" name="usuario.email" class="" />
<div class="erro-msg"></div>
Senha: <input type="text" name="usuario.senha" class="" />
<div class="erro-msg"></div>
Confirmar: <input type="text" name="confir" class="error-class" />
<div class="erro-msg">As duas senhas digitadas não conferem.</div>
O modo antigo ainda funciona, e a lista antiga também pode ser acessada
<c:forEach var="error" items="${validatorErrors.errorList}">
${error.category} - ${error.message}<br />
</c:forEach>
ou
<c:forEach var="error" items="${errors}">
${error.category} - ${error.message}<br />
</c:forEach>
Agora segue o código, é só
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.View;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.caelum.vraptor.validator.DefaultValidator;
import br.com.caelum.vraptor.validator.Message;
import br.com.caelum.vraptor.validator.Outjector;
import br.com.caelum.vraptor.view.ValidationViewsFactory;
@Component
@RequestScoped
public class ImprovedValidator extends DefaultValidator implements Serializable {
private static final long serialVersionUID = 4037899473291836489L;
private Map<String,String> message = new HashMap<String, String>();
private List<Message> errorList = new ArrayList<Message>();
private Map<String,Boolean> hasError = new HashMap<String, Boolean>();
private final Result result;
public ImprovedValidator(Result result,
ValidationViewsFactory factory, Outjector outjector) {
super(result, factory, outjector);
this.result = result;
}
@Override
public <T extends View> T onErrorUse(Class<T> view) {
if (hasErrors())
result.include("validatorErrors", this);
return super.onErrorUse(view);
}
private void putOnMap(Message m) {
this.message.put(m.getCategory(), m.getMessage());
this.hasError.put(m.getCategory(), true);
}
@Override
public void add(Message message) {
putOnMap(message);
this.errorList.add(message);
super.add(message);
}
@Override
public void addAll(Collection<? extends Message> messages) {
for(Message message : messages)
putOnMap(message);
this.errorList.addAll(messages);
super.addAll(messages);
}
public boolean getNotEmpty() {
return hasErrors();
}
public boolean getIsEmpty() {
return !getNotEmpty();
}
public List<Message> getErrorList() {
return errorList;
}
public Map<String, String> getMessage() {
return message;
}
public Map<String, Boolean> getHasError() {
return hasError;
}
public int getSize() {
return errorList.size();
}
}

