2017-08-25 3 views
1

Spring MVCのユーザーに制限をかけて、列挙型の特定の値にしかアクセスできないようにするには、要求されたパラメータに制限値が含まれている場合に制約をスローする必要があります。@RequestParamが列挙型のリストになることを確認する

列挙例:私はControllerにWebRequestクラスにしたい上記列挙型で

public enum EnumActionValues { 

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

LOGGED_INLOGGED_OUTが内部的に使用される、ユーザーによって許されるべきではない、だけgetManuallyAllowedActions含まれている必要があります。

@Valid/@Validatedで使用する直接注釈はありますか。

+0

あなたはカスタムBeanバリデータを書く必要があります。 –

+0

@NicoVanBelleはい、それに対して、私はモデル属性にrequestParamを作成する必要があります。この場合、Enum値はnull、それを制限する方法。 – Charles

答えて

1

あなたの要件は非常に具体的であり、おそらく自分で小切手を書く必要があると思います。このようなものは、このトリックを行う必要があります。

public ResponseEntity someEndpoint(final EnumActionValues aAction) { 

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

    ... 
} 
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であるためにこのバリができますリクエストではnull

@RequestParamの代わりに@ModelAttribute注釈を使用する必要があることに注意してください。

関連する問題