我有一个dto对象,它使用第一个和最后一个字段来保持IP范围。简单的CRUD操作与使用dropwizard这个类(新泽西州杰克逊 - Hibernate验证)Bean验证 - 构造函数/工厂参数
public class IpRangeDto {
@JsonCreator
public static IpRangeDto fromCidr(@JsonProperty("cidr") String cidr) {
//Resolve CIDR and assign first and last fields
}
@NotNull
@IpAddress // My custom validator
private String first;
@NotNull
@IpAddress
private String last;
}
对于用户友好的缘故,我决定加入的另一种方式来创建这个对象,这是通过使用CIDR制造。因此,客户端可以发送JSON中的first
和last
字段或仅发送cidr
字段。因此,使用@JsonCreator的方式如上所述。它工作得很好。
"ipRange":{
"first": "15.0.0.1",
"last": "15.0.0.255",
}
"ipRange":{
"cidr": "15.0.0.0/24"
}
我要验证此CIDR值,它是正确的格式,这样我就可以适当的错误消息返回422。如果我在构造函数/工厂方法中抛出异常,那么泽西 - 杰克逊直接返回400(即使我抛出ConstraintViolationException
,它被封装为JsonProcessingException
)。
我可以简单地忽略这些异常,并将字段留空,由于@NotNull
约束,这些字段将返回422,但这样错误信息就不会像应该那样清晰。
我试着在@JsonProperty
参数旁边添加我的@Cidr
验证程序,但这似乎并不奏效。我的理解是验证发生在Jackson完成创建Dtos后,因此使用我的@JsonCreator
方法可能没有解决此问题的方法。所以我也开放重构建议。