首先,我必须承认我是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。
非常感谢任何和所有帮助。
答案 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
实体响应,详细说明验证错误。