不验证@RequestParam是否必需= false

时间:2018-08-23 21:51:17

标签: java spring validation spring-boot annotations

我已经创建了一个自定义验证器注释,我只想在username不为null时使用它。我有一个不需要@RequestParam String username的端点,那里一切都很好。注释存在问题,因为无论变量是否存在,它都会验证username。我只想验证username是否存在。这是代码:

username

注释:

@RequestMapping(value = "", method = RequestMethod.GET)
public ResponseEntity get( @RequestParam(value = "username", required = false) @ExistAccountWithUsername(required = false) String username) {
    if (username != null) {
        return getUsersByUsername(username);
    }
    return getAllUsers();
}

验证者:

@Filled
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ExistAccountWithUsernameValidator.class)
public @interface ExistAccountWithUsername {
  boolean required() default true;
  String message() default "There is no account with such username";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
}

编辑:我添加了参数。 public class ExistAccountWithUsernameValidator implements ConstraintValidator<ExistAccountWithUsername, String> { private UserService userService; private boolean required; public ExistAccountWithUsernameValidator(UserService userService) { this.userService = userService; } public void initialize(ExistAccountWithUsername constraint) { required = constraint.required(); } public boolean isValid(String username, ConstraintValidatorContext context) { if (!required) { return true; } return username != null && userService.findByUsername(username).isPresent(); } } @Filled@NotBlank。更新的代码。它返回:

@NotNull

2 个答案:

答案 0 :(得分:1)

在您的自定义验证器中,您可以执行以下空检查:

@Override
public boolean isValid(String value, ConstraintValidatorContext context)
{
    if(value == null)
        return true;
    return someFurtherCheck(value, context);
}

这样,它将被接受是否为null,否则进行检查。 另外,如果您想在其他地方重复使用此验证器,而null值应返回false,则可以在要检查的字段顶部添加一个@NotNull,也可以在验证器注释中添加规定该null值的参数应该被接受还是不被接受。

最新方法可以按照以下步骤进行:

@ExistAccountWithUsername类:

public @interface ExistAccountWithUsername {


String message() default "your message";
Class[] groups() default {};

Class[] payload() default {};

boolean acceptNull() default true;

}

ValidatorClass:

public class ExistAccountWithUsernameValidator implements ConstraintValidator<ExistAccountWithUsername, String> {

private boolean acceptNull;

@Override
public void initialize(ExistAccountWithUsername constraintAnnotation){
    acceptNull = constraintAnnotation.acceptNull();
}

@Override
public boolean isValid(String value, ConstraintValidatorContext context)
{
    if(value == null)
       return acceptNull;
    return someFurtherCheck(value, context);
}


 }

因此,现在当您不想接受此验证器的空值时,只需使用@ExistAccountWithUsername(acceptNull = false)而不是@ExistAccountWithUsername

答案 1 :(得分:1)

我看到您可能已经创建了验证批注@ExistAccountWithUsername。重用它,并将条件添加到ConstraintValidator::isValid方法中。

@Override
public boolean isValid(String username, ConstraintValidatorContext context) {
    if (username == null) {
        return true;  // is valid
    } else {
        // ... further validation in case the username is not null
    }
}

以防我误解了您的@ExistAccountWithUsername注释。 Baeldung的文章Method Constraints with Bean Validation 2.0中有非常详细的指南。