【问题标题】:Jeresy Jackson BigDecimal Post泽西杰克逊 BigDecimal Post
【发布时间】:2014-08-01 08:57:16
【问题描述】:

我遇到了一个问题。我无法在自己的班级中正确使用BigDecimal 来执行发布操作。希望得到建议 使用 Jersey 2.x、Jackson 1.8

我的班级

public final class TestModel{

    private BigDecimal ffff;

    public BigDecimal getFfff() {
        return ffff;
    }

    public void setFfff(BigDecimal ffff) {
        this.ffff = ffff;
    }

    public void setFfff(double ffff) {
        this.ffff = new BigDecimal(ffff).setScale(2, RoundingMode.HALF_EVEN);
    }

}

并尝试做简单的发布操作

@POST
@Path("/test")
@Consumes(MediaType.APPLICATION_JSON)
public Response test(TestModel tt) {
    log.entry();
    log.info(tt);               
    log.exit();
    return Response.status(201).entity("").build();
}

但结果我得到 {ClientResponse{method=POST, uri=http://somehost:8080/test, status=400, reason=Bad Request}

让方法正常工作。如果我尝试为BigDecimal 发帖也有效,那么当我尝试将BigDecimal 放入我自己的班级而不是尝试用它发帖时就会出现问题

【问题讨论】:

  • TestModel 应该来自哪里? Is 是路径参数、查询参数或表单参数。你需要告诉泽西从哪里得到它。还要检查您发布的 json 值,以确保其格式正确。最后,在 Jersey 注册一个LoggingFilter,这样你就可以准确地追踪发生了什么。
  • link = exmaple 。我按照这个例子没有任何 post 参数的定义。是否需要使用注释以及为什么感谢 logginFilter 去检查
  • 呵呵,每天都学点新东西。我从来没有像以前那样使用过@POST。谢谢你教育我!

标签: post jersey jackson bigdecimal


【解决方案1】:

问题解决了。 问题是,我有 2 个 setter 方法。并且当我在执行操作后杰克逊将变量反序列化为 BigDecimal 但尝试使用 setter 进行双精度操作时。 解决方案是将setter重命名为double或使用自己的反序列化

public class TestDeser extends JsonDeserializer<Double> {
    @Override
    public Double deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
        return jp.getDoubleValue();      
    }

在模型课上

 @JsonDeserialize(using = TestDeser.class)
public void setCheat(double cheat) {
    this.cheat = new BigDecimal(cheat).setScale(2,RoundingMode.HALF_EVEN);
}

但我不知道哪种解决方案更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2012-06-07
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    相关资源
    最近更新 更多