2017-09-24 8 views
1

Spring Validatorと@Validatedアノテーションを使用してGet Requestパラメータを検証しようとしていますが、バリデータを実行できません。私はModelAttributeを使用してバリデーターをリクエストボディの代わりにパス変数で実行しようとしています。 Get Request Path Variableでバリデーターを実行することは可能ですか?ここでSpring @Validated Annotationを使用してGetリクエストパス変数を検証する

は、エンドポイントを打ったときにどちらのプリント文が実行されている私のコントローラクラスとメソッド

@RestController 
public class ProfileController { 

    @RequestMapping(value = "/profile/{param}", method = RequestMethod.GET) 
    public IVRProfile getProfile(@Validated(ParamValidator.class) @ModelAttribute("param") String param) { 

    return sampleProfile(); 
    } 

    @ModelAttribute("param") 
    public String paramAsModelAttribute(@PathVariable String param) { 
     return param; 
    } 

} 

そしてValidatorクラス

@Component 
public class ParamValidator implements Validator 
{ 

    @Override 
    public boolean supports(Class<?> clazz) 
    { 
     System.out.println("Validator supports test"); 
     return String.class.isAssignableFrom(clazz); 
    } 

    @Override 
    public void validate(Object target, Errors errors) 
    { 
     System.out.println("Validator Test"); 
     // Validation code 

    } 

} 

です。

私が行方不明になったり、別のやり方で助けてくれれば、大変感謝しています。

答えて

0

statusのような単一のRequestParamsを取得したい場合は、以下のコードに従って強制することができます。

@RestController 
public class ProfileController { 

    @RequestMapping(value = "/profile/{param}", method = RequestMethod.GET) 
    public IVRProfile getProfile(@RequestParam(name = "status", required = true) String status, @ModelAttribute("param") String param) {} 

} 

強制的にPathVariableにしたい場合は、これを実行します。

@RestController 
public class ProfileController { 

    @RequestMapping(value = "/profile/{param}", method = RequestMethod.GET) 
    public IVRProfile getProfile(@PathVariable(name = "param", required = true) String param, @ModelAttribute("param") String param) {} 

} 

希望がこの作品!!!

+0

こんにちはOyewole。私はポストではっきりしていないことを知っている、私はパス変数を要求していないパラメータを検証することを意味した。より一貫性のあるように投稿を更新しました。私の問題は、変数を取得することではなく、変数にバリデータを実行することです – BlakeM

1

次のように、必要な検証機能を実装できます。

public class ParamValidator implements ConstraintValidator<ParamConstraint, String> { 

    @Override 
    public void initialize(ParamConstraint paramConstraint) { 
    } 

    @Override 
    public boolean isValid(String paramField, ConstraintValidatorContext cxt) { 
     //Perform paramField validation 
     return true; 
    } 
} 

-

@Documented 
@Constraint(validatedBy = ParamValidator.class) 
@Target({ ElementType.PARAMETER }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ParamConstraint { 

    String message() default "Default validation message"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 
} 

-

@RequestMapping(value = "/profile/{param}", method = RequestMethod.GET) 
public IVRProfile getProfile(@Valid @ParamConstraint @ModelAttribute("param") String param) { 
    return sampleProfile(); 
} 

そして最後に@Validatedでコントローラーに注釈を付けることを忘れないでください。

@RestController 
@Validated 
public class ProfileController { 
    //... 
} 

詳しくは、前述のhereの例を参照してください。

関連する問題