Las versiones más recientes de los servicios de conversión de formato introducidas y Spring Framework para hacerse cargo de estas tareas, de alguna manera de salir del sistema de editores de propiedades atrás. Sin embargo, el problema informado lamentablemente sigue presente: el predeterminado DateFormatter
is unable to properly convert una cadena vacía a un objeto null
Date
. Lo que encuentro extremadamente irritante es que la documentación de Spring contains a date formatter snippet example where the proper guard clauses are implemented para ambas conversiones (ay desde cadenas). Esta discrepancia entre la implementación del framework y la documentación del framework realmente me vuelve loco, tanto que incluso podría intentar enviar un parche tan pronto como encuentre algún tiempo para dedicarme a la tarea.
Mientras tanto, mi sugerencia a todo el mundo que tiene este problema durante el uso de una versión moderna del marco de la primavera es una subclase del defecto DateFormatter
y anular su método parse
(su método print
, también, si es necesario) a fin de añadir una cláusula de guardia en la forma de la que se muestra en la documentación.
package com.example.util;
import java.text.ParseException;
import java.util.Date;
import java.util.Locale;
public class DateFormatter extends org.springframework.format.datetime.DateFormatter {
@Override
public Date parse(String text, Locale locale) throws ParseException {
if (text != null && text.isEmpty()) {
return null;
}
return super.parse(text, locale);
}
}
Entonces, algunas modificaciones deben ser aplicadas a la configuración del resorte XML: un grano de servicio de conversión debe ser definido, y el atributo correspondiente en el elemento de annotation-driven
en el espacio de nombres mvc
deben establecerse correctamente.
<mvc:annotation-driven conversion-service="conversionService" />
<beans:bean
id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<beans:property name="formatters">
<beans:set>
<beans:bean class="com.example.util.DateFormatter" />
</beans:set>
</beans:property>
</beans:bean>
Para proporcionar un formato de fecha específica, la propiedad pattern
del grano DateFormatter
debe ajustarse adecuadamente.
<beans:bean class="com.example.util.DateFormatter">
<beans:property name="pattern" value="yyyy-MM-dd" />
</beans:bean>
¿Cómo puede funcionar para cadenas no vacías si no registró un PropertyEditor personalizado? – axtavt
Porque Spring tiene una serie de PropertyEditors integrados, como en: http://static.springsource.org/spring/docs/3.0.3.RELEASE/spring-framework-reference/html/validation.html#beans-beans- conversión –
También dice que CustomDateEditor NO está registrado por defecto, pero parece que de hecho lo es. –