将JSON映射到POJO时的Jackson验证

时间:2016-01-24 17:11:47

标签: json jackson mapping dropwizard pojo

首先,我必须承认我是Web Services和DropWizard框架的新手。

我正在执行POST请求并尝试将JSON正文解析为POJO。

当JSON采用所需格式时,这非常有用。但是,当JSON中的某个键丢失时,我的POJO将转换为默认值。

我的问题是,无论如何都要检查所有值的JSON,或者如果缺少JSON密钥,杰克逊会抛出某种异常?

public class PlacedBetDecimal extends PlacedBet {

    private double odds;

    // Empty constructor to please Jackson
    public PlacedBetDecimal() {

    }

    public PlacedBetDecimal(@JsonProperty("bet_id") long bet_id,
                            @JsonProperty("stake") int stake,
                            @JsonProperty("odds") double odds) {

        super.bet_id = bet_id;
        super.stake = stake;
        this.odds = odds;
    }

    public double getOdds() {
        return odds;
    }

    @Override
    public String toString() {
        return "PlacedBetFractional{" +
                "bet_id="+super.bet_id+
                "stake="+super.stake+
                "odds=" + odds +
                '}';
    }
}

身体中的JSON如下:

{
    "bet_id": 1,
    "odds": 11.0,
    "stake": 10
}

如果由于某种原因,有人提供了一个身体:

{
    "odds": 11.0,
    "stake": 10
}

然后我希望能够抓住这个而不是杰克逊自动将bet_id填充为0。

非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:0)

不使用primitives,而是使用相应的类型包装器,例如Double代替double,并使用@NotNull等bean验证限制标记它们。

  

我的问题是,无论如何要检查所有人的JSON   如果使用JSON密钥,杰克逊会通过某种异常获得价值   不见了?

在我看来,将Bean Validation约束添加到POJO,然后对传入的表示执行验证。如果至少存在一个约束违规,Dropwizard将返回422 Unprocessable实体响应。

假设你有一个Person

public class Person {

    @NotEmpty // ensure that name isn't null or blank
    private String name;

    @NotNull @Min(18) // at least 18 years old!
    private Integer age;

    // getters and setters
}

然后,在我们的资源类中,我们可以将@Valid@Validated注释添加到Person

@PUT
public Person replace(@Valid Person person) {
    // do stuff
}

如果名称年龄字段丢失,Dropwizard将返回422 Unprocessable实体响应,详细说明验证错误。