2012-01-26 32 views
17

Tôi có một dự án Spring 3.1 MVC, và tôi đang gặp rắc rối deserializing một yêu cầu gửi đến các phương pháp điều khiển sau:@JsonSerialize/@JsonDeserialize không gọi với Spring MVC

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

Yêu cầu đối tượng, trong đó có một giá trị Joda tiền, mà tôi đã đăng ký một tùy chỉnh serializer/deserializer cho:

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

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

Tuy nhiên, deserializer này không bao giờ được gọi. Khi tôi gửi JSON sau, tôi nhận được phản hồi 400 - Bad Request, mà tôi cho rằng người lập bản đồ không được tìm thấy.

{ 
    "amount" : "30AUD" 
} 

Tôi có cần nói với Spring về trình ánh xạ này bằng cách nào đó hoặc chú thích đủ không? Tôi nên thực hiện các bước nào khác để làm cho quá trình deserialization hoạt động?

Trả lời

11

Theo số Javadoc of JsonDeserialize bạn nên sử dụng chú thích đó trên bộ đặt, chứ không phải bộ thu thập (trong khi JsonSerialize thực sự nên ở trên bộ thu).

+0

Bạn phải cấu hình lớp deserializer không? Tôi đang cố gắng tương tự với joda-time http://stackoverflow.com/q/9484869/106261 – NimChimpsky

6

Bạn cũng có thể đính kèm deserializer bạn/serializer để lượng lĩnh vực:

@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

Bạn có hiểu tại sao 'JodaMoneyDeserializer' sẽ không được sử dụng nếu bạn chỉ định thuộc tính' as = JodaMoney.class' như được chỉ định trong [tài liệu] (http://fasterxml.github.io/jackson-databind/javadoc/2.4/com/fasterxml/jackson/databind/annotation/JsonDeserialize.html)? Tôi chỉ có thể làm cho nó chạy khi tôi sử dụng 'using =' nhưng không có thuộc tính nào khác. – JJD

+1

@JJD Tôi chưa từng sử dụng chú thích "như" trước đây. Nhưng nếu tôi hiểu nó một cách chính xác, "AS" là để deserializing vào loại bạn cung cấp trong chú thích và "USING" là cho deserializing vào loại tuyên bố bằng cách sử dụng lớp được chỉ định trong chú thích. – Andy

+0

Vâng, nó bằng cách nào đó phù hợp với những gì các tài liệu nói: * "nếu using() cũng được sử dụng nó có quyền ưu tiên [...] và giá trị của thuộc tính chú thích này bị bỏ qua" *. Mặc dù, tôi không thể xác nhận rằng 'as =' bị bỏ qua - nó không làm việc gì cả cho tôi khi tôi chỉ định cả hai cùng một lúc. – JJD