2016-07-12 7 views
0

RESTサービスと対話するSpring MVCを使用するアプリケーションがあります。 UIには、JSPを使用した一般的なフォーム入力があります。Spring MVCでは、入力をJackson @JsonFormatで日付フィールドにバインドできません

public class TheObject { 

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

そしてUIに、これは入力にバインドされています:

<form:input path="myDate"/> 

あり

は、私は、ユーザーが変更し、それが日付フィールドを含んで存続することを可能にするオブジェクトでありますだから、私のコントローラで私がフォームを投稿すると、その入力ボックスに適切な "yyyy-MM-dd"文字列を入力しました。フィールドとバインディングエラーのためにnullが返されます。

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] 

私は@Validを取る場合、私は同じメッセージを持つ例外を取得:コントローラのメソッドは、私はそこBindingResultを見れば、私は次のことを言ってエラーを参照してください。このよう

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

を探します。

これをどのようにバインドできますか?

アノテーションを@DateTimeFormat(pattern = "yyyy-MM-dd")に置き換えると、バインディングは正常に動作します。しかし、オブジェクトにはJacksonの注釈が必要です。私はちょうど両方の注釈を追加することができます実現し、それは誰かが私は「何を考えていない限りだから私は他の誰がこの渡って来る場合の答え(としてこれを投稿します

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

を動作するすべての投稿の後にそう

答えて

1

上で説明しているmは実際には悪い習慣か何かです)。

+1

'@ DateTimeFormat'がモデル属性のバインディングに使用されます。 '@ JsonFormat'はそのプロセスとは無関係です。 '@ JsonFormat'はジャクソンのシリアル化に使用されます。 '@ DateTimeFormat'はそのプロセスとは無関係です。 –

+0

ありがとう!それは私が結論づけたものであり、2つの属性が一緒になっていることを認識していませんでした。 – Luke

関連する問題