2012-01-26 20 views
17

bir bahar 3.1 MVC proje, ve sorun şu kontrol yöntemine gönderilen bir talep deserializing having:@JsonSerialize/@JsonDeserialize Spring MVC ile çağrılır

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

istek nesnenin içeriyorsa

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

Ve deserializer:

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); 
    } 
} 
Ben için özel bir seri hale/deserializer kayıtlı ettik Joda Para değeri,

Ancak, bu desperizer hiçbir zaman çağrılmaz. Aşağıdaki JSON'u gönderdiğimde, eşleştirmenin bulunamadığı varsayıldığını düşündüğüm bir 400 - Bad Request yanıtı alıyorum.

{ 
    "amount" : "30AUD" 
} 

Spring'i bu harita hakkında bir şekilde anlatmalı mıyım, yoksa ek açıklama yeterli mi? Serileştirmeyi işe almak için başka hangi adımları atmalıyım?

cevap

11

Javadoc of JsonDeserialize'a göre, bu notu alıcıda değil, ayarlayıcıda kullanmalısınız (JsonSerialize gerçekten de alıcıda olmalıdır).

+0

siz de deserializer sınıfını yapılandırmak zorunda mıyım? Joda-time ile aynı şeyi deniyorum http://stackoverflow.com/q/9484869/106261 – NimChimpsky

6

Ayrıca miktarı alanına kendi deserializer/seri hale ekleyebilirsiniz:

@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

"JodaMoneyDeserializer" in, "as = JodaMoney.class" özniteliğini belirtildiği gibi kullanmamasının nedenini anlıyor musunuz? [belgeler] (http://fasterxml.github.io/jackson-databind/javadoc/2.4/com/fasterxml/jackson/databind/annotation/JsonDeserialize.html)? Ben sadece 'using =' işlevini kullanırken başka bir öznitelik kullanılmadığında çalışabilirdim. – JJD

+1

@JJD Daha önce "not" olarak kullanmıyorum. Ancak doğru şekilde anlarsam, "AS", ek açıklamada sağladığınız türden seri hale getirme içindir ve "KULLANIM" ifadesi, ek açıklamada belirtilen sınıf kullanılarak bildirilen türün içine serileştirilmesi içindir. – Andy

+0

Evet, bir şekilde doktorların söylediklerine uyuyor: * "eğer using() kullanılırsa önceliği vardır [...] ve bu açıklama özelliğinin değeri yok sayılır" *. Yine de, 'as = 'göz ardı edildiğini doğrulayamıyorum - her ikisini de aynı anda belirttiğim zaman hiç işe yaramadı. – JJD