我有一個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
方法可能沒有解決此問題的方法。所以我也開放重構建議。