2011-01-26 10 views
30

Ho un campo di modulo che dovrebbe essere convertito in un oggetto Date, come segue:Conversione stringa vuota a null oggetto Date con la Primavera

<form:input path="date" /> 

Ma io voglio ottenere un valore nullo quando questo campo è vuoto, invece di quello che ricevo:

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'; 

C'è un modo semplice per indicare che le stringhe vuote devono essere convertite in null? O dovrei scrivere il mio PropertyEditor?

Grazie!

+0

Come può funzionare per stringhe non vuote se non è stato registrato un PropertyEditor personalizzato? – axtavt

+0

Poiché Spring ha un numero di PropertyEditors incorporati, come in: http://static.springsource.org/spring/docs/3.0.3.RELEASE/spring-framework-reference/html/validation.html#beans-beans- conversione –

+0

Dice anche che CustomDateEditor NON è registrato di default, ma sembra proprio che lo sia! –

risposta

48

Spring fornisce un PropertyEditor denominato CustomDateEditor che è possibile configurare per convertire una stringa vuota in un valore null. È in genere necessario registrarlo in un metodo del controller @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

più recenti versioni dei servizi di conversione e di formattazione introdotte framework Spring per prendersi cura di questi compiti, in qualche modo lasciando dietro di sé il sistema di editor di proprietà. Tuttavia, il problema segnalato è ancora presente: il valore predefinito DateFormatteris unable to properly convert una stringa vuota su un oggetto Date. Quello che trovo estremamente irritante è la documentazione Spring contains a date formatter snippet example where the proper guard clauses are implemented per entrambe le conversioni (da e verso le stringhe). Questa discrepanza tra l'implementazione del framework e la documentazione del framework mi fa davvero impazzire, tanto che potrei persino provare a inviare una patch non appena avrò un po 'di tempo da dedicare all'attività.

Nel frattempo, il mio suggerimento a tutti incontrare questo problema durante l'utilizzo di una versione moderna del framework Spring è quello di creare una sottoclasse di default DateFormatter e sovrascrivere il metodo parse (il suo metodo print, anche se è necessario), in modo da aggiungere una clausola di salvaguardia alla maniera di quella mostrata nella documentazione.

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

} 

Poi, alcune modifiche devono essere applicate alla configurazione della sorgente XML: un fagiolo servizio di conversione deve essere definito, e l'attributo corrispondente nell'elemento annotation-driven nella mvc namespace devono essere impostati correttamente.

<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> 

Per fornire un formato di data specifica, la proprietà del fagiolo DateFormatterpattern deve essere impostato correttamente.

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

Molto utile, grazie. Se stavo usando la configurazione Spring in stile Java piuttosto che XML, sai come ottenerlo? – Luke

+0

@Luke sfortunatamente, io no. Devo ancora usare la configurazione basata su Java in un progetto Spring. –

+0

Ok grazie, sembra che la maggior parte della roba in rete per Spring MVC e Spring Webflow config sia in stile XML (anche i documenti) :) – Luke

Problemi correlati