验证@RequestParam是否在枚举列表中

时间:2017-08-25 07:24:41

标签: java spring enums

我想限制Spring MVC的用户只访问枚举的某些值,当请求的param包含限制值时,我需要抛出约束异常。

枚举示例:

public enum EnumActionValues {

  WAIT,
  OFFLINE,
  LOGGED_IN,
  LOGGED_OUT,
  OTHERS,
  //
  ; 
  public List<EnumActionValues> getManuallyAllowedActions() {
    return Arrays.asList(
        WAIT,
        OFFLINE,
        OTHERS
    );
  }
}

在上面的枚举中,我想要Controller的网络请求只应包含getManuallyAllowedActions,用户不应允许LOGGED_INLOGGED_OUT,将在内部使用。

是否有与@Valid/@Validated一起使用的直接注释。

2 个答案:

答案 0 :(得分:2)

您可以拥有自定义注释和随附的验证器。

您的注释可能如下所示:

@Documented
@Constraint(validatedBy = YourConstraintValidator.class)
@Target( { ElementType.FIELD } )
@Retention(RetentionPolicy.RUNTIME)
public @interface YourConstraint
{
    String message() default "Invalid enum";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

你的验证员将是:

public class YourConstraintValidator implements ConstraintValidator<YourConstraint, EnumActionValues> {
    @Override
    public void initialize(YourConstraint constraint) {
    }

    @Override
    public boolean isValid(EnumActionValues obj, ConstraintValidatorContext context) {
        return obj == null || obj.getManuallyAllowedActions().contains(obj);
    }
}

此验证器允许枚举为null,因此如果请求中的枚举为空,它仍然有效。

请注意,您必须使用@ModelAttribute注释而不是@RequestParam才能生效。

答案 1 :(得分:1)

我认为您的要求非常具体,您可能需要自己编写支票。这样的事情可以解决问题:

public ResponseEntity someEndpoint(final EnumActionValues aAction) {

  if ((aAction != null) && !EnumActionValues.getManuallyAllowedActions().contains(aAction)) {
    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
  }

  ...
}