@JsonSerialize/@JsonDeserialize не вызывается с помощью Spring MVC - программирование
Подтвердить что ты не робот

@JsonSerialize/@JsonDeserialize не вызывается с помощью Spring MVC

У меня есть проект 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 об этом картографе, или достаточно аннотации? Какие еще шаги я должен предпринять, чтобы заставить десериализацию работать?

4b9b3361

Ответ 1

В соответствии с Javadoc JsonDeserialize вы должны использовать эту аннотацию для установщика, а не для получателя (в то время как 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;
}