[英]Spring boot - Combine DTO and form validation
我目前正在開發一個API,這是我第一次使用DTO。 到目前為止,我已經將Spring的表單驗證與javax.validation
。
所以我的問題是,是否有一種將DTO和“表單”驗證結合起來的方法。 讓我自己解釋一下:假設我有一項服務可以登錄,另外一項可以注冊。 在注冊服務中,我們有:名稱,密碼和電子郵件,必須填寫其中三個。 對於登錄服務,只需填寫電子郵件和密碼。 所以我們會有類似的東西:
private String name;
private String password;
private String email;
到目前為止,我所做的是為每個請求(表單)創建一個POJO,然后使用諸如@NotNull
注釋,但是現在在項目中使用DTO,現在它們只是具有相同的DTO和具有相同屬性的業務對象,並且沒有限制。
我該怎么做我平時的工作? 在控制器中檢查必須為非null的字段對我來說有點臟,我不能只在UserDTO
放置類似@NotNull
之類的UserDTO
因為然后在兩個示例中,我說我必須在登錄時也發送name
盡管該服務不是必需的。
那么,我如何將這兩件事結合起來呢? 這是不可能的還是有更好的方法?
謝謝。
我假設您使用兩個單獨的控制器進行登錄和注冊請求。 如果是這種情況,那么您可以充分利用org.springframework.validation.Validator接口:
@Component("registrationValidator")
public class RegistrationValidatorImpl implements Validator {
@Override
public boolean supports(final Class<?> aClass) {
}
@Override
public void validate(final Object o, final Errors errors) {
}
}
在您的控制器中創建RegistrationValidatorImpl和LoginValidatorIml並使用@Autowire對其進行創建。
驗證器的用法很簡單:
invokeValidator(registrationValidator, someDTO, errors);
if (errors.hasErrors()) {
return new ResponseEntity(HttpStatus.BAD_REQUEST); //or whatever logic here
}
控制器方法簽名應與此類似:
@RequestMapping(value = "/register", method = RequestMethod.POST)
public ResponseEntity register(@RequestBody final SomeDTO someDTO, final HttpServletRequest request, final Errors errors) {}
以一個控制器為例,我假設您具有映射到登錄和注冊請求的不同方法。 您可以@Autowire控制器中的兩個驗證器,並在單獨的方法中使用它們。
使用組使用javax.validation
進行驗證可以javax.validation
工作。 我遵循了這個問題的答案(就像安德魯建議的那樣),然后我只需要把我想要的每個字段都放在不同的組中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.