我目前正在开发一个API,这是我第一次使用DTO。到目前为止,我已经将Spring的表单验证与javax.validation
一起使用。
所以我的问题是,是否有一种将DTO和“表单”验证结合在一起的方法。让我自己解释一下:假设我有一项服务可以登录,另外一项可以注册。在注册服务中,我们有:名称,密码和电子邮件,必须填写其中三个。对于登录服务,只需填写电子邮件和密码。所以我们会有类似的东西:
private String name;
private String password;
private String email;
直到现在,我所做的是为每个请求(表单)创建一个POJO,然后使用诸如@NotNull
之类的注释,但是现在在项目中使用DTO,我现在他们拥有相同的DTO和业务具有相同属性且没有约束的对象。
我该怎么做我通常做的事情?在控制器中检查必须为非null的字段对我来说有点脏,我不能只在@NotNull
中放入类似UserDTO
的内容,因为然后在两个示例中我说在登录时也发送name
,尽管该服务并不需要。
那么,我该如何结合这两件事?这是不可能的还是有更好的方法?
谢谢。
答案 0 :(得分:0)
我假设您使用两个单独的控制器来登录和注册请求。 如果是这种情况,那么您可以充分利用org.springframework.validation.Validator接口:
require('path')
在您的控制器中创建RegistrationValidatorImpl和LoginValidatorIml,然后@Autowire。
验证器的用法很简单:
@Component("registrationValidator")
public class RegistrationValidatorImpl implements Validator {
@Override
public boolean supports(final Class<?> aClass) {
}
@Override
public void validate(final Object o, final Errors errors) {
}
}
控制器方法签名应与此类似:
invokeValidator(registrationValidator, someDTO, errors);
if (errors.hasErrors()) {
return new ResponseEntity(HttpStatus.BAD_REQUEST); //or whatever logic here
}
在一个控制器的情况下,我假设您具有映射到登录和注册请求的不同方法。您可以@Autowire控制器中的两个验证器,并在单独的方法中使用它们。
答案 1 :(得分:0)
使用小组与javax.validation
进行验证即可完成工作。我遵循了this问题的回答(如安德鲁所建议的那样),然后我只需要将我想要的每个字段放在不同的组中即可。