Java 在自定义验证器Spring Rest中返回HTTP代码
我正在使用Spring开发一个API REST,并尝试创建一个新的自定义验证器,其中包含2个验证 对于每个验证器,我想向用户返回一个不同的HTTP代码,但我一直坚持,我只知道我可以在isValid方法中返回一个布尔值 我希望有人能帮助我或给我一个更好的方法来完成这件事 UserController.java UserConstraint.javaJava 在自定义验证器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
@已记录
@约束(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");