2016-07-12 8 views
0

Ich habe eine Anwendung mit Spring MVC, die mit einem REST-Dienst interagiert. Die Benutzeroberfläche verfügt über eine typische Formulareingabe mithilfe von JSP.Im Frühjahr MVC kann keine Eingabe an ein Datumsfeld mit einem Jackson @ JsonFormat

Es ist ein Objekt, das ich dem Benutzer das schließt ein Datumsfeld zu ändern und bleiben zulassen möchte:

public class TheObject { 

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "PST") 
    private Date myDate; 
    . 
    . 
    . 
} 

Und auf der UI dies an einen Eingang gebunden ist:

<form:input path="myDate"/> 

Also, in meinem Controller, wenn ich das Formular post, und ich habe eine richtige "JJJJ-MM-TT" Zeichenfolge eingegeben in diesem Eingabefeld bekomme ich Null für das Feld und einen verbindlichen Fehler. Controller-Methode sieht wie folgt aus

@RequestMapping(value = "thePath", method = RequestMethod.POST) 
public String postMyForm(@Valid @ModelAttribute final theObject backingModel, final BindingResult result, final Model model, 
     final HttpServletRequest request) throws Exception { 

     //Breakpoint here to check the binding 
} 

Wenn ich am BindingResult sehen dort sehe ich eine Fehlermeldung, die folgenden:

Field error in object 'backingModel' on field 'theDate': rejected value [2016-07-07]; codes [typeMismatch.backingModel.theDate,typeMismatch.theDate,typeMismatch.java.util.Date,typeMismatch]; 
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [backingModel.theDate,theDate]; 
arguments []; default message [theDate]]; 
default message [Failed to convert property value of type [java.lang.String] to required type [java.util.Date] for property 'theDate'; 
nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@com.fasterxml.jackson.annotation.JsonFormat java.util.Date] for value '2016-07-07'; nested exception is java.lang.IllegalArgumentException] 

Wenn ich die @Valid nehmen ich eine Ausnahme mit der gleichen Botschaft.

Wie soll ich das binden können?

Wenn ich die Annotation durch @DateTimeFormat (Muster = "JJJJ-MM-TT") ersetzen, funktioniert die Bindung einwandfrei. Aber das Objekt benötigt diese Jackson Annotation.

Antwort

1

Nach all der Veröffentlichung, die ich merkte, ich kann nur beide Anmerkungen hinzufügen und es funktioniert

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "PST") 
@DateTimeFormat(pattern = "yyyy-MM-dd") 
private Date myDate; 

Also das ich Post als Antwort, falls jemand über diese kommt (es sei denn, jemand denkt, was ich m oben beschrieben ist wirklich schlechte Praxis oder irgendetwas).

+1

'@ DateTimeFormat' wird für die Bindung von Modellattributen verwendet. '@ JsonFormat' ist für diesen Prozess irrelevant. '@ JsonFormat' wird für die Jackson-Serialisierung verwendet. '@ DateTimeFormat' ist für diesen Prozess nicht relevant. –

+0

Danke! Das ist ziemlich genau das, was ich zu dem Schluss gekommen bin, dass die 2 Attribute nicht zusammen passen. – Luke