tutorial mvc initializr framework español java spring spring-mvc

java - mvc - Convirtiendo cadena vacía en nulo Objeto fecha con primavera



spring mvc vs spring boot (2)

Tengo un campo de formulario que se debe convertir a un objeto Date, de la siguiente manera:

<form:input path="date" />

Pero quiero obtener un valor nulo cuando este campo está vacío, en lugar de recibirlo:

Failed to convert property value of type ''java.lang.String'' to required type ''java.util.Date'' for property ''date''; org.springframework.core.convert.ConversionFailedException: Unable to convert value "" from type ''java.lang.String'' to type ''java.util.Date'';

¿Hay alguna manera fácil de indicar que las cadenas vacías deben convertirse a nulas? ¿O debería escribir mi propio PropertyEditor ?

¡Gracias!


Las versiones más recientes del marco Spring introdujeron servicios de conversión y formato para encargarse de estas tareas, dejando de alguna manera el sistema de editores de propiedades. Sin embargo, lamentablemente, el problema informado sigue presente: el DateFormatter predeterminado no puede convertir correctamente una cadena vacía en un objeto Date null . Lo que me resulta extremadamente irritante es que la documentación de Spring contiene un ejemplo de fragmento de formato de fecha en el que se implementan las cláusulas de protección adecuadas para ambas conversiones (hacia y 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 para todos los que encuentren este problema al usar una versión moderna del framework Spring es subclasificar el DateFormatter predeterminado y anular su método de parse (también su método de print , si es necesario) para agregar una cláusula guard en la moda 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); } }

A continuación, se deben aplicar algunas modificaciones a la configuración de XML Spring: se debe definir un bean de servicio de conversión y el atributo correspondiente en el elemento de annotation-driven en el espacio de nombres de mvc debe establecer 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ífico, la propiedad de pattern del bean DateFormatter debe establecerse correctamente.

<beans:bean class="com.example.util.DateFormatter"> <beans:property name="pattern" value="yyyy-MM-dd" /> </beans:bean>


Spring proporciona un PropertyEditor llamado CustomDateEditor que puede configurar para convertir un String vacío en un valor nulo. Por lo general, debe registrarlo en un método @InitBinder de su controlador:

@InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false); // true passed to CustomDateEditor constructor means convert empty String to null binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); }