2016-09-06 5 views
0

に私は、カスタムバリデータを作成するには、このチュートリアルに従っ: http://codetutr.com/2013/05/29/custom-spring-mvc-validation-annotations/カスタムValidatorはコントローラのメソッド

そして、この1によれば、JSR-303の検証アノテーションで要求agumentsを検証することが可能です: https://raymondhlee.wordpress.com/2015/08/29/validating-spring-mvc-request-mapping-method-parameters/

マイカスタムConstraintValidatorは呼び出されません。ここに私のコードです:

コントローラー:

@RestController 
@RequestMapping(value = "/json") 
@Validated 
public class JsonResource { 

    @RequestMapping(method = POST, consumes=APPLICATION_JSON_VALUE")) 
    public void postJson(@SafeHtml @RequestBody JsonNode jsonQuery){ 
     // post a foo 
    } 

} 

SafeHtml注釈:

@Documented 
@Constraint(validatedBy = {SafeHtmlJsonValidator.class}) 
@Target({ElementType.PARAMETER, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface SafeHtml { 

    String message() default "{SafeHtml}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 

カスタムConstraintValidator:

@Component 
public class SafeHtmlJsonValidator implements ConstraintValidator<SafeHtml, JsonNode> { 

    @Override 
    public void initialize(SafeHtml constraintAnnotation) {} 

    @Override 
    public boolean isValid(JsonNode value, ConstraintValidatorContext context) { 
     // validate my JSON 

     return true; 
    } 
} 

問題はSafeHtmlJsonValidator.isValid()が呼び出されないことです。春4.2.6.RELEASE

+0

のような直接法の分野に

を検証アノテーションを追加することができますMethodValidationPostProcessor

@Bean public MethodValidationPostProcessor methodValidationPostProcessor() { return new MethodValidationPostProcessor(); } 

を追加することができますDTOにすべてを変換したくない場合関連性があるかどうかわからない場合は、投稿の作者がyear.clss参照を持つSubscriber.javaを作成しましたが、あなたは@SafeHtml権限を使用していますJsonポストリクエストメソッドのパラメータ。 – Zeus

答えて

2

、あなたが

@RestController 
@RequestMapping(value = "/json") 
@Validated 
public class JsonResource { 

    @RequestMapping(method = POST, consumes=APPLICATION_JSON_VALUE")) 
    public void postJson(@SafeHtml @RequestBody JsonNode jsonQuery){ 
     // post a foo 
    } 

} 
+0

それは私が必要としていたものです! – Pleymor

0

でテスト

私は@RequestBodyパラメータにカスタム検証(@SafeHtml)で注釈をつけることは、コントローラのメソッドに動作するかどうかわかりません。それは、コントローラメソッドの@RequestParamと@PathVariableに対して、取得要求があったときに確実に機能します。

ポストリクエストの場合、リクエストボディを表すPOJO Beanが必要であり、カスタムリクエストアノテーションはこのリクエストオブジェクトの属性に配置する必要があります。

例では、理想的には、属性JsonNodeを持つRequestObj.classが必要です。これには、@ SafeHtmlという注釈を付ける必要があります。

すでにコントローラのクラスレベルで@Validatedを注釈を付けているので、コントローラのメソッドは、

@RequestMapping(method = POST, consumes=APPLICATION_JSON_VALUE")) 
public void postJson(@RequestBody RequestObj requestBody){ 
    // post a foo 
} 

とRequestObj.classこれは、カスタムをトリガーする必要があり

@SafeHtml 
private JsonNode jsonQuery; 
//getters,setters... 

必要がありますされますバリデータ。試すだけの価値があります。あなたの要求json構造はそれに応じて変化することに注意してください。

+0

はい、このプロジェクトでは、多くのコントローラーにはDTO(POJO Bean)がありません。そのため、私はこのようにしました。 できない場合は、コントローラメソッドごとにPOJO Beanを作成する必要があります。 – Pleymor

関連する問題