Olá a todos !
Estive tendo o mesmo problema, e depois de muito penar, finalmente entendi qual o problema no meu caso. No meu JSP eu tenho:
<form action="<c:url value="/notasFiscaisEntrada/gravar"/>" method="post">
....
<label for="dataEntrada">Data Entrada:</label>
<input type="text" id="dataEntrada" name="notaFiscalEntrada.dataEntrada"
value="<fmt:formatDate pattern="dd/MM/yyyy" value="${notaFiscalEntrada.dataEntrada}" />"/><br />
....
</form>
Quando executo pela primeira vez não há problema, já que notaFiscalEntrada.dataEntrada é do tipo java.util.Date.
Porem quando retorno a esta página após um erro, ela quebra com o erro
Cannot convert 01/09/2010 of type class java.lang.String to class java.util.Date
Bem, o que esta acontecendo ? No vRaptor (3.1.0) temos o DefaultValidator:
public class DefaultValidator implements Validator {
...
public <T extends View> T onErrorUse(Class<T> view) {
if (!hasErrors()) {
return new MockResult().use(view); //ignore anything, no errors occurred
}
result.include("errors", errors);
outjector.outjectRequestMap();
return viewsFactory.instanceFor(view, errors);
}
...
}
Na chamada outjector.outjectRequestMap() todos os campos são transformador em String. E a tag necessita de um um value do tipo java.util.Date.
Como resolver ? No meu caso, criei uma taglib de formatação que pode aceitar tanto String quanto Date
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
<tlib-version>1.0</tlib-version>
<short-name>xxx</short-name>
<uri>/WEB-INF/tlds/xxxTagLibrary</uri>
<tag>
<name>formatDate</name>
<tag-class>com.xxx.ui.util.tag.FormatDateTagHandler</tag-class>
<body-content>empty</body-content>
<attribute>
<name>pattern</name>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>Object</type>
</attribute>
</tag>
</taglib>
e a classe:
public class FormatDateTagHandler extends SimpleTagSupport {
private String pattern;
private Object value;
@Override
public void doTag() throws JspException {
JspWriter out = getJspContext().getOut();
try {
JspFragment f = getJspBody();
if (f != null) {
f.invoke(out);
}
if (value == null) {
out.print("");
} else if (value instanceof Date) {
out.print(getDateFormat().format((Date) value));
} else {
// aqui tratamos na segunda chamada depois de um erro, quando a campo esta como String
out.print(value);
}
} catch (java.io.IOException ex) {
throw new JspException("Error in FormatDateTagHandler tag", ex);
}
}
private DateFormat getDateFormat() {
if (pattern == null) {
return new SimpleDateFormat("dd/MM/yyyy");
} else {
return new SimpleDateFormat(pattern);
}
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
public void setValue(Object value) {
this.value = value;
}
}
o JSP ficou quase o mesmo:
<%@ taglib prefix="xxx" uri="/WEB-INF/tlds/xxxTagLibrary" %>
...
<label for="dataEntrada">Data Entrada:</label>
<input type="text" id="dataEntrada" name="notaFiscalEntrada.dataEntrada"
value="<xxx:formatDate pattern="dd/MM/yyyy" value="${notaFiscalEntrada.dataEntrada}" />"/><br />
e pronto, não tive mais problemas. Ainda precisa de alguns ajustes finos, mas a idéia geral é esta.
Espero que ajude !
Felipe T. Farias