【问题标题】:Making request to @Valid向@Valid 发出请求
【发布时间】:2017-11-20 16:11:38
【问题描述】:

我正在开发 spring-boot 应用程序,我需要在检查其他信息之前验证用户信息。这是一个sn-p:

@RequestMapping(value = "/create-user", method = RequestMethod.POST)
public String ceateCustomer(@Valid @RequestBody User user){ 
      myService.create(user);
}

当用户来自另一个路由/create-sp-user时,我必须重新验证用户:

@RequestMapping(value = "/create-sp-user", method = RequestMethod.POST)
    public String ceateCustomer(@Valid @RequestBody User user){ 
      user.setSp(true);
      // I tried @Valid user without success
      // In my User class if sp = true the field telNumber is mandatory   
      myService.create(user);
}

你有什么想法吗?

最好的问候

【问题讨论】:

  • 您可以轻松编写自己的自定义验证器,因为没有默认验证器可以根据其他值检查必填字段。
  • 对不起,我没有得到你想要的。来自客户端的用户结构是什么?或者,您想在设置 sp = true 之后 验证用户?在这种情况下,您可能希望按照此处所述编写自定义验证器:stackoverflow.com/questions/12146298/… - @valid 注释在控制器中执行任何代码之前对其进行检查。
  • 谢谢@Dominik 是的,我必须在将 sp 设置为 true 后验证用户

标签: java spring validation spring-boot jsr


【解决方案1】:

就像 Dominik 说的,@Valid 注解在控制器中执行任何代码之前验证对象

如果你想在方法中验证对象,你应该使用自定义验证器。

实现org.springframework.validation.Validator并在控制器内部调用validate方法。

@RequestMapping(value = "/create-sp-user", method = RequestMethod.POST)
    public String ceateCustomer(@Valid @RequestBody User user, BindingResult result){ 
      user.setSp(true);
      CustomValidator customValidator = new CustomValidator();
      customValidator.validate(user, result);

      if (result.hasErrors()){
        //do something
      } else {
        myService.create(user);
      }
}

【讨论】:

  • 感谢@Janar 我试过你的解决方案,但我一直有 0 个错误。
  • 也许你错误地实现了验证器?请发布您的验证器代码。
  • 嗨@Janar 我正在与@Olivier 合作,这是验证器类public class UserValidator implements Validator { protected Logger logger = LoggerFactory.getLogger(UserValidator.class); @Override public boolean supports(Class<?> clazz) { return userInfo.class.equals(clazz); } @Override public void validate(Object target, Errors errors) { User userInfo = (User) target; ... // Phone number if (StringUtils.isBlank(userInfo.getPhoneNumber())) { errors.rejectValue("phoneNumber", "phoneNumber[required]", "Failed"); } .. } }
  • supports 方法似乎执行错误 - 你应该检查是否User.class.equals(clazz);。还可以尝试调试 validate 方法 - 它是否被调用,调用时 phoneNumber 是否为空?
  • 当我调用@Valid User 时它可以工作,但是当我在类包装器上调用@Valid 时,比如class testWrapper { @Valid private UserInfo u1 , @Valid private UserInfo u2}
猜你喜欢
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 2019-08-17
  • 2021-10-06
  • 2019-11-23
相关资源
最近更新 更多