2011-01-26 10 views
30

Tengo un campo de formulario que debe ser convertido en un objeto Date, de la siguiente manera:conversión de cadena vacía en null objeto Date con la primavera

<form:input path="date" /> 

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

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 una manera fácil de indicar que las cadenas vacías se deben convertir en nulo? ¿O debería escribir mi propio PropertyEditor?

Gracias!

+0

¿Cómo puede funcionar para cadenas no vacías si no registró un PropertyEditor personalizado? – axtavt

+0

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 –

+0

También dice que CustomDateEditor NO está registrado por defecto, pero parece que de hecho lo es. –

Respuesta

48

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

@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)); 
} 
5

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 DateFormatteris unable to properly convert una cadena vacía a un objeto nullDate. 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> 
+0

Muy útil gracias. Si estuviese utilizando la configuración Spring de estilo Java en lugar de XML, ¿sabe cómo lograr esto? – Luke

+0

@Luke, lamentablemente, yo no. Todavía tengo que usar la configuración basada en Java en un proyecto de Spring. –

+0

Ok, gracias, parece que la mayoría de las cosas en la red para Spring MVC y Spring Webflow son de estilo XML (incluso los documentos) :) – Luke

Cuestiones relacionadas