@JsonSerialize / @JsonDeserialize не вызывается с Spring MVC - PullRequest
18 голосов
/ 27 января 2012

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

Ответы [ 2 ]

12 голосов
/ 27 января 2012

Согласно Javadoc JsonDeserialize вы должны использовать эту аннотацию на установщике, а не на получателе (тогда как JsonSerialize действительно должен быть на получателе).

7 голосов
/ 26 сентября 2014

Вы также можете прикрепить свой десериализатор / сериализатор к сумму поле:

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

public Money getAmount() {
    return amount;
}

public void setAmount(Money amount) {
    this.amount = amount;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...