Java 在自定义验证器Spring Rest中返回HTTP代码

Java 在自定义验证器Spring Rest中返回HTTP代码,java,spring,rest,spring-boot,spring-rest,Java,Spring,Rest,Spring Boot,Spring Rest,我正在使用Spring开发一个API REST,并尝试创建一个新的自定义验证器,其中包含2个验证 对于每个验证器,我想向用户返回一个不同的HTTP代码,但我一直坚持,我只知道我可以在isValid方法中返回一个布尔值 我希望有人能帮助我或给我一个更好的方法来完成这件事 UserController.java UserConstraint.java @已记录 @约束(validatedBy=UserValidator.class) @目标({ElementType.METHOD,ElementTy

我正在使用Spring开发一个API REST,并尝试创建一个新的自定义验证器,其中包含2个验证

对于每个验证器,我想向用户返回一个不同的HTTP代码,但我一直坚持,我只知道我可以在isValid方法中返回一个布尔值

我希望有人能帮助我或给我一个更好的方法来完成这件事

UserController.java UserConstraint.java
@已记录
@约束(validatedBy=UserValidator.class)
@目标({ElementType.METHOD,ElementType.FIELD})
@保留(RetentionPolicy.RUNTIME)
public@interface用户约束{
字符串消息()默认为“无效年龄”;
类[]组()默认值{};

类您可以尝试这样的操作:在UserValidator上的isValid方法抛出新的自己的异常,例如UnderageUserException。类UnderageException应该扩展RuntimeException,您需要为422使用@ResponseStatus(value=HttpStatus.UNPROCESSABLE_ENTITY)对此进行注释。
您可以抛出一个
ResponseStatusException

throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "error message");

为什么不在age上使用标准的最小/最大验证程序?我需要为每个验证程序返回不同的HTTP代码和消息,此外,我需要对该方法应用更多案例(具有更多逻辑)。我建议您可以使用ThreadLocal在UserValidator中设置验证结果,然后您可以在UserController中获取要检查的值
public class User {

    @NotNull
    private final String name;

    @NotNull
    @UserConstraint
    private final Integer age;

    public User(@JsonProperty("name") String name, @JsonProperty("age") Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

}
@Documented
@Constraint(validatedBy = UserValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserConstraint {
   String message() default "Invalid age";
   Class<?>[] groups() default {};
   Class<? extends Payload>[] payload() default {};
}
public class UserValidator implements ConstraintValidator<UserConstraint, Integer>  {

        @Override
        public void initialize(UserConstraint constraintAnnotation) {
        }

        @Override
        public boolean isValid(Integer age, ConstraintValidatorContext context) {

          if(age > 60) {
              //Here I want to return HTTP CODE 402 to the user 
              return false;
          } else if(age < 18) {
              //Here I want to return HTTP CODE 422 to the user 
              return false;
          }
          return true;  
    }
}
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "error message");