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

标签 java spring spring-mvc jackson

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

@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 这个映射器,或者注释是否足够? 我应该采取哪些其他步骤才能使反序列化工作?

最佳答案

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

关于java - @JsonSerialize/@JsonDeserialize 未使用 Spring MVC 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9025912/

相关文章:

java - 通过 Spring Web-Socket 定期向客户端发送消息

java - spring jpa onetomany 连接表审计

java - 为什么找不到 getservletcontext?

java - 将 spring Controller 绑定(bind)到根 Controller

java - 检查给定端口是否在 Java 中使用 TLS 的最有效方法是什么?

java - 更改滑动选项卡布局的属性

java - @initbinder 不适用于特定模型属性

java - "ProcessBuilder.command"的参数语法

java - Spring 3.2 通过 @Resource 对原始类型进行依赖注入(inject)

java - 集成测试将整个对象发布到 Spring MVC Controller