VRaptor validator, onde fica o objeto ${erros} ? (qual escopo)

8 respostas
Lavieri

estou precisando colocar este objeto dentro de outro… para tal, preciso saber onde ele fica, pra qual escopo ele vai… alguem sabe ?

8 Respostas

lucasmazza

Request, o validator usa result.include(“errors”, errors)

G

O escopo dele é no request, com o nome errors, e nada mais é que um List<? extends Message>.

Lavieri

pois é … essa lista q é um problema =P … precisava era de um mapa O.O … vou fazer meu encapsulamento maluco

Lucas_Cavalcanti

cria um interceptor que pega essa variavel errors e transforma num mapa…

vc pode fazer isso com result.included().get(“errors”) ou algo do tipo

G

Lucas, não dá para o Lavieri sobrescrever o validator padrão e fazer o mapeamento interno com um map?

Lavieri

se eu soubesse o nome do interceptor é o q eu faria… o.O

Lavieri

Pronto consegui!

&lt;c:if test="${validatorErrors.notEmpty}"&gt;
						Ocorreram falhas!!
					&lt;/c:if&gt;
					&lt;c:if test="${validatorErrors.hasError.login}"&gt;
						${validatorErrors.message.login}
					&lt;/c:if&gt;
					&lt;c:forEach var="error" items="${validatorErrors.errorList}"&gt;
    					${error.category} - ${error.message}<br />
					&lt;/c:forEach&gt;

eu criei, um objeto q encapsula a lista de mensagem, conforme abaixo

package br.com.simtecnologia.vraptor3.validator;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.caelum.vraptor.validator.Message;

@Component
@RequestScoped
public class ValidatorView implements Serializable {
	private static final long serialVersionUID = -7168827997755295928L;
	private final Result result;
	private final Validator validator;
	private Map&lt;String,String&gt; message;
	private List&lt;Message&gt; errorList;
	private Map&lt;String,Boolean&gt; hasError;
	
	
	public ValidatorView(Result result, Validator validator) {
		this.result = result;
		this.validator = validator;
	}
	
	public boolean isNotEmpty() {
		return validator.hasErrors();
	}
	
	public boolean isEmpty() {
		return !isNotEmpty();
	}
	
	@SuppressWarnings("unchecked")
	public List&lt;Message&gt; getErrorList() {
		if (errorList == null)
			errorList = (List&lt;Message&gt;) result.included().get("errors");
		return errorList;
	}
		
	public Map&lt;String, String&gt; getMessage() {
		if (message == null) {
			message = new HashMap&lt;String, String&gt;();
			hasError = new HashMap&lt;String, Boolean&gt;();
			for (Message m :getErrorList()) {
				message.put(m.getCategory(), m.getMessage());
				hasError.put(m.getCategory(), true);
			}
		}
		return message;
	}
	
	public Map&lt;String, Boolean&gt; getHasError() {
		if (hasError == null)
			getMessage();
		return hasError;
	}
}

e então eu injeto ele em um interceptor, e jogo dentro do result.include, atravez da key validatorErrors

ficou Xou de bola!!

Lucas_Cavalcanti

o que o garcia falou é de criar uma classe:

@Component
public class MeuValidator extends DefaultValidator {
     //delegate constructor
     @Override
     public void add(Message message) {
           //adiciona no mapa
          super.add(message);
     }
     //getter pro mapa
}

e na jsp vc consegue acessar via ${meuValidator.mapa}

Criado 24 de fevereiro de 2010
Ultima resposta 24 de fev. de 2010
Respostas 8
Participantes 4