【问题标题】:Spring boot - Combine DTO and form validationSpring boot - 结合 DTO 和表单验证
【发布时间】:2018-10-29 19:36:13
【问题描述】:

我目前正在开发第一次使用 DTO 的 API。到目前为止,我已经使用了 Spring 的表单验证和javax.validation

所以我的问题是,是否有办法将 DTO 和“表单”验证结合起来。让我解释一下自己:假设我有一个服务要登录,另一个要注册。在注册服务中我们有:姓名、密码和邮箱,其中3个必须填写。登录服务只需要填写邮箱和密码即可。所以我们会有类似的东西:

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

到目前为止,我所做的是为每个请求(表单)创建一个 POJO,然后使用 @NotNull 等注释,但现在在我所在的项目中使用 DTO,它们只是具有相同的 DTO 和业务对象相同的属性,没有约束。

我怎么能做我平时做的事?检查控制器中不能为空的字段对我来说看起来有点脏,我不能只在 UserDTO 中添加类似 @NotNull 的内容,因为在两个示例中我说我还必须发送name 登录时,虽然该服务不需要它。

那么,我怎样才能将这两件事结合起来呢?这是不可能的还是有更好的方法?

谢谢。

【问题讨论】:

  • 可能与this other question有关。
  • @AndrewS 我想这就是我需要的我想,我现在应该怎么做?删除这个问题? Idk 重复/相关时该怎么办

标签: java spring forms spring-boot dto


【解决方案1】:

我假设您使用两个单独的控制器来进行登录和注册请求。 如果是这样的话,那么你可以好好利用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 它。

validator的用法很简单:

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 两个验证器,并在单独的方法中使用每个验证器。

【讨论】:

  • 嗨,我使用相同的控制器,因为两者都与用户相关
  • 更新了我的答案。
【解决方案2】:

通过javax.validation 使用组进行验证就可以了。我按照this 问题中的答案(正如 Andrew 建议的那样),然后我只需要将我想要的每个字段放在不同的组中都有不同的规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 2016-06-30
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多