我有這些只讀字段,需要安全,如密碼。假設我們有一個用戶對象:Dropwizard僅在@POST上驗證字段
public class User {
@NotEmpty
@Size(max = 100)
private String name;
@NotEmpty
private String username;
@NotEmpty
@Email
private String email;
private String password;
@JsonIgnore
public String getPassword() {
return password;
}
@JsonProperty
public void setPassword(String password) {
this.password = password;
}
}
所以,這很好用;如我可以得到/張貼/放置任何我想要的,但我永遠不會收到密碼。但我也想確保當它第一次發佈時,密碼不應該是空的。如果我做
@NotEmpty
private string password;
然後我的PUT(編輯)請求將失敗,驗證錯誤,如果我不想更改此用戶的密碼。
有兩個解決方案,我能想到的:
繼承User類,僅創建了POST一類特殊的,可以有超過吸氣劑@NotEmpty註解。
public static class Create extends User {
@NotEmpty
@Override
public String getPassword() {
return password;
}
}
這應該一般工作,但不適合我的代碼庫,因爲它已經在CRUD資源上大大利用了繼承。我需要爲這種方法打破並重復很多事情。在資源類
2-處理驗證:
public class UserResource {
@POST
public User createUser(User user) {
if(user.getPassword().isEmpty()) {
throw new ConstraintValidation....();
}
}
}
做工作,但不是那麼漂亮。特別是因爲我有這些5-10。
其他選擇?
你能不能讓你自己的驗證器實現,而不是使用默認的,然後有更復雜的檢查?例如,您可以有一個驗證程序,可以檢查用戶是否存在(如果不是您正在創建),然後基於此驗證密碼。我不認爲你有權訪問驗證器中的資源類型,除非你實現了一個將你的方法類型存儲在一個threadLocal或類似的愚蠢的球衣過濾器。 – pandaadb
其實,閱讀球衣信息,你可以在你的驗證器中注入UriInfo。然後,您將不會根據所調用的資源方法驗證問題。請參閱:https://jersey.java.net/documentation/latest/bean-validation.html – pandaadb
啊哈,我實際上已經考慮過這一點,並檢查ConstraintValidatorContext的字段,看看我能否找到相關的東西。沒有想到球衣注射。我想這也適用於hibernate-validator,對吧?如果是這樣,你可以創建一個答案,我可以標記它。謝謝! – Natan