簡體   English   中英

春季啟動-結合DTO和表單驗證

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM