@JsonSerialize / @JsonDeserialize未使用Spring MVC调用

2022-09-02 21:42:05

我有一个Spring 3.1 MVC项目,但我在反序列化发送到以下控制器方法的请求时遇到问题:

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

包含Joda Money值的请求对象,我已为其注册了自定义序列化程序/反序列化程序:

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

我需要以某种方式告诉Spring这个映射器,还是注释就足够了?我应该采取哪些其他步骤来使反序列化正常工作?


答案 1

根据JsonDeserialize的Javadoc,你应该在setter上使用该注释,而不是getter(虽然确实应该在getter上)。JsonSerialize


答案 2

您还可以将解串器/序列化程序附加到数量字段:

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

public Money getAmount() {
    return amount;
}

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

推荐