泽西杰克逊BigDecimal Post

时间:2014-08-01 08:57:16

标签: post jersey jackson bigdecimal

我遇到了一个问题。我无法在自己的课堂上正确使用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放入我自己的课程而不是尝试用它发布时问题出现

1 个答案:

答案 0 :(得分:0)

问题解决了。 问题是,我有2个setter方法。当我做后期动作时,杰克逊将变量deserilize变量变为BigDecimal,但试图将setter用于double。 解决方案是将setter重命名为double或使用自己的deserilization

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);
}

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