Vraptor3: Erros ao validar dados, RequestOutjectMap

5 respostas
G

Ao usar o validator tenho o seguinte erro:

java.lang.IllegalArgumentException: Cannot convert  of type class br.com.caelum.vraptor.view.RequestOutjectMap to class java.lang.Long
	org.apache.el.lang.ELSupport.coerceToNumber(ELSupport.java:271)
	org.apache.el.lang.ELSupport.equals(ELSupport.java:133)

O código é:

<c:if test="${city.code gt 1}">
    The code is ${city.code}
</c:if>

Se eu coloco ${not empty city.code} o JSTL retorna sempre true, mesmo o valor sendo null.

No controller meu código é trivial:

if (city.getName() == null) {
    validator.add(new ValidationMessage("Nome é null", "error"));
}

validator.onErrorUse(Results.logic()).forwardTo(getClass()).edit(city.getId());

Creio ser relacionado a issue 150, do outjector conforme esse tópico: http://guj.com.br/posts/list/15/143727.java

5 Respostas

Lucas_Cavalcanti

sim… tem a ver… esse requestOutjectMap eh meio bugado… vou tentar corrigir isso usando uma parte daquela sua implementação mto em breve…

G

Fiz um debug no Jasper, já que o glassfish usa esse cara para JSP, e achei nesse método abaixo algo um pouco estranho. Olhando a implementação do RequestOutjectMap me parece tudo ok, porém ao executar esse código o que entra em obj é o próprio RequestOutjectMap, ao invés do valor do number.

Eu até achei que o problema era que o RequestOutjectMap retorna uma String ao invés de um número, mas isso não seria problema.

public final static Number coerceToNumber(final Object obj, final Class type)
        throws IllegalArgumentException {
    if (obj == null || "".equals(obj)) {
        return coerceToNumber(ZERO, type);
    }
    if (obj instanceof String) {
        return coerceToNumber((String) obj, type);
    }
    if (ELArithmetic.isNumber(obj)) {
        return coerceToNumber((Number) obj, type);
    }

    if (obj instanceof Character) {
        return coerceToNumber(new Short((short) ((Character) obj).charValue()), type);
    }

    throw new IllegalArgumentException(MessageFactory.get("error.convert", obj, obj.getClass(), type));
}
Lucas_Cavalcanti

sim… os valores ficam no toString do RequestOutjectMap… moh gambi :stuck_out_tongue:

mas a gente vai mudar isso em breve…

G

lucascs:
sim… os valores ficam no toString do RequestOutjectMap… moh gambi :stuck_out_tongue:

mas a gente vai mudar isso em breve…

Mas no debug notei que isso não é o problema. O que achei estranho é estar entrando o próprio objeto RequestOutjectMap ao invés do valor de toString.

Lucas_Cavalcanti

o problema eh que tudo é RequestOutjectMap… todos os valores… todos os parametros viram RequestOutjectMap… e na função coerseToNumber ele tenta dar um cast para algum tipo de numero e claramente não dá =(

Criado 4 de dezembro de 2009
Ultima resposta 5 de dez. de 2009
Respostas 5
Participantes 2