Ros*_*tel 33 java validation spring hibernate spring-mvc
我正在使用Hibernate和Spring Annotations进行大量验证,如下所示:
public class Account {
    @NotEmpty(groups = {Step1.class, Step2.class})
    private String name;
    @NotNull(groups = {Step2.class})
    private Long accountNumber;
    public interface Step1{}
    public interface Step2{}
}
然后在控制器中调用它:
public String saveAccount(@ModelAttribute @Validated({Account.Step1.class}) Account account, BindingResult result) {
   //some more code and stuff here
   return "";
}
但我想基于控制器方法中的一些逻辑来决定使用的组.有没有办法手动调用验证?有点像result = account.validate(Account.Step1.class)?
我知道创建自己的Validator类,但这是我想避免的,我宁愿只使用类变量本身的注释.
Pav*_*ral 40
在回答中比Jaiwo99更进一步:
// org.springframework.validation.SmartValidator - implemented by
//     LocalValidatorFactoryBean, which is funny as it is not a FactoryBean per se (just saying)
@Autowired
SmartValidator validator;
public String saveAccount(@ModelAttribute Account account, BindingResult result) {
    // ... custom logic
    validator.validate(account, result, Account.Step1.class);
    if (result.hasErrors()) {
        // ... on binding or validation errors
    } else {
        // ... on no errors
    }
    return "";
}
而强制链接SmartValidator的JavaDoc如果你有兴趣.
dig*_*oel 24
这是JSR 303规范的代码示例
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Driver driver = new Driver();
driver.setAge(16);
Car porsche = new Car();
driver.setCar(porsche);
Set<ConstraintViolation<Driver>> violations = validator.validate( driver );
所以,是的,您可以从验证器工厂获取验证器实例并自行运行验证,然后检查是否存在违规.您可以在javadoc中看到Validator它还将接受要验证的组数组.
显然,这直接使用JSR-303验证而不是通过Spring验证,但我相信如果在类路径中找到弹簧验证注释将使用JSR-303
如果您已正确配置所有内容,则可以执行以下操作:
@Autowired
Validator validator;
然后,您可以使用它来验证您的对象.
此链接提供了在 Spring 应用程序中使用验证的很好示例。 https://reflectoring.io/bean-validation-with-spring-boot/
我在本文中找到了一个以编程方式运行验证的示例。
class MyValidatingService {
  void validatePerson(Person person) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<Person>> violations = validator.validate(person);
    if (!violations.isEmpty()) {
      throw new ConstraintViolationException(violations);
    }
  } 
}
它抛出500状态,因此建议使用自定义异常处理程序来处理它。
@ControllerAdvice(annotations = RestController.class)
public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<CustomErrorResponse> constraintViolationException(HttpServletResponse response, Exception ex) throws IOException {
        CustomErrorResponse errorResponse = new CustomErrorResponse();
        errorResponse.setTimestamp(LocalDateTime.now());
        errorResponse.setStatus(HttpStatus.BAD_REQUEST.value());
        errorResponse.setError(HttpStatus.BAD_REQUEST.getReasonPhrase());
        errorResponse.setMessage(ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
    }
}
第二个例子来自https://www.mkyong.com/spring-boot/spring-rest-error-handling-example/
更新:不推荐使用验证是持久层:https : //twitter.com/odrotbohm/status/1055015506326052865
除了@digitaljoel 的回答之外,您可以在获得一组违规后抛出 ConstraintViolationException。
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        Set<ConstraintViolation<NotionalProviderPaymentDTO>> violations = validator.validate( notionalProviderPaymentDTO );
        if(!violations.isEmpty()) {
            throw new ConstraintViolationException(violations);
        }
您可以创建自己的异常映射器,它将处理 ConstraintViolationException 并将错误消息发送到客户端。
| 归档时间: | 
 | 
| 查看次数: | 40488 次 | 
| 最近记录: |