2012-01-26 4 views
17

私は春3.1 MVCプロジェクトを持っている、と私はトラブル下記のコントローラメソッドに送信された要求デシリアライズ抱えている:@JsonSerialize/@JsonDeserialize春のMVCで呼び出さない

@RequestMapping(value="/deposit",method=RequestMethod.POST) 
public void deposit(@RequestBody DepositRequest request) 
{ 
} 

リクエストオブジェクトが含まれ

public class DepositRequest { 
    private Money amount; 
    @JsonDeserialize(using=JodaMoneyDeserializer.class) 
    @JsonSerialize(using=JodaMoneySerializer.class) 
    public Money getAmount() { 
     return amount; 
    } 
    public void setAmount(Money amount) { 
     this.amount = amount; 
    } 
} 

デシリアライザ:

public class JodaMoneyDeserializer extends JsonDeserializer<Money> { 

    @Override 
    public Money deserialize(JsonParser parser, DeserializationContext context) 
      throws IOException, JsonProcessingException { 
     String text = parser.getText(); 
     return Money.parse(text); 
    } 
} 
私はのためのカスタム・シリアライザ/デシリアライザを登録したジョダマネー値、

ただし、このデシリアライザは呼び出されません。次のJSONを送信すると、400 - Bad Requestというレスポンスが返されます。これは、マッパーが見つからなかったとみなします。

{ 
    "amount" : "30AUD" 
} 

私は何とかこのマッパーについて春を伝える必要があり、または十分な注釈ですか? デシリアライゼーションを機能させるためには、他に何をすべきですか?

答えて

11

Javadoc of JsonDeserializeによれば、ゲッターではなくセッターでそのアノテーションを使用する必要があります(JsonSerializeがゲッターにあるべきです)。

+0

はあなたにもデシリアライザクラスを設定する必要がありますか?私はjoda-timeと同じことを試みています。http://stackoverflow.com/q/9484869/106261 – NimChimpsky

6

またフィールドに自分のデシリアライザ/シリアライザを添付できます。

@JsonDeserialize(using=JodaMoneyDeserializer.class) 
@JsonSerialize(using=JodaMoneySerializer.class) 
private Money amount; 

public Money getAmount() { 
    return amount; 
} 

public void setAmount(Money amount) { 
    this.amount = amount; 
} 
+0

あなたが指定した 'as = JodaMoney.class'属性を指定した場合、' JodaMoneyDeserializer'が使われない理由を理解していますか? [documentation](http://fasterxml.github.io/jackson-databind/javadoc/2.4/com/fasterxml/jackson/databind/annotation/JsonDeserialize.html)? 'using ='を使用しても他の属性は使用しないと実行できません。 – JJD

+1

@JJD私は前に "as"というアノテーションを使っていません。しかし、正しく理解すれば、 "AS"はアノテーションで指定した型にデシリアライズし、 "USING"はアノテーションで指定されたクラスを使用して宣言型にデシリアライズします。 – Andy

+0

ええ、それはどういうわけかdocsが言うものに合っています:* "using()も使われていれば、それは優先順位[...]を持ち、この注釈プロパティの値は無視されます" *。しかし、私はas =が無視されていることを確認することはできませんが、私は両方を同時に指定しても、それはまったく機能しませんでした。 – JJD

関連する問題