春季启动-结合DTO和表单验证

时间:2018-10-29 19:36:13

标签: java spring forms spring-boot dto

我目前正在开发一个API,这是我第一次使用DTO。到目前为止,我已经将Spring的表单验证与javax.validation一起使用。

所以我的问题是,是否有一种将DTO和“表单”验证结合在一起的方法。让我自己解释一下:假设我有一项服务可以登录,另外一项可以注册。在注册服务中,我们有:名称,密码和电子邮件,必须填写其中三个。对于登录服务,只需填写电子邮件和密码。所以我们会有类似的东西:

private String name;
private String password;
private String email;

直到现在,我所做的是为每个请求(表单)创建一个POJO,然后使用诸如@NotNull之类的注释,但是现在在项目中使用DTO,我现在他们拥有相同的DTO和业务具有相同属性且没有约束的对象。

我该怎么做我通常做的事情?在控制器中检查必须为非null的字段对我来说有点脏,我不能只在@NotNull中放入类似UserDTO的内容,因为然后在两个示例中我说在登录时也发送name,尽管该服务并不需要。

那么,我该如何结合这两件事?这是不可能的还是有更好的方法?

谢谢。

2 个答案:

答案 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问题的回答(如安德鲁所建议的那样),然后我只需要将我想要的每个字段放在不同的组中即可。