我想限制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_IN
和LOGGED_OUT
,将在内部使用。
是否有与@Valid/@Validated
一起使用的直接注释。
答案 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);
}
...
}