2016-01-24 79 views
0

首先,我必须承认我对Web服务和DropWizard框架完全陌生。将JSON映射到POJO时的杰克逊验证

我目前正在执行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.

任何和所有的帮助将大大appr eciated。

回答

0

而不是使用primitives,使用它们相应的类型包装,例如, Double而不是double,并用诸如@NotNull之类的bean验证约束标记它们。

我的问题是,反正是有任一检查JSON所有 值或者通过某种异常具有杰克逊如果JSON关键 缺什么?

在我看来,将Bean Validation约束添加到您的POJO s,然后对传入表示进行验证。如果至少存在一个约束违规,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实体响应细节g验证错误。

+1

嗨,谢谢你的回答。我试试看。我之前使用过NotEmpty注解不会产生任何影响,但是我不知道您还必须使用Valid来标记资源。 再次感谢:) –