1

プロジェクトに対してSpring 5を評価しており、Monoパラメータを検証する最良の方法がわかりません。伝統的に、私たちは以下のように私たちのメソッドパラメータを検証するためにMethodValidationPostProcessorを使用していました:Spring Reactiveを使用する際にMonoを検証する方法

@Validated 
@Service 
public class FooService 

@Validated(SignUpValidation.class) 
public void signup(@Valid UserCommand userCommand) { 

    ... 
} 

私たちは、その後、ControllerAdviceErrorControllerで例外を処理し、クライアントに適したの4xx応答を渡します。

ただし、パラメータをMonoに変更すると、以下のように機能しなくなります。

@Validated 
@Service 
public class FooService 

@Validated(SignUpValidation.class) 
public Mono<Void> signup(@Valid Mono<UserCommand> userCommand) { 

    ... 
} 

私がSpring Reactiveを理解しているように、おそらく実際には動作していないはずです。だから、MonoFluxを検証し、適切なエラー応答を送信するためのSpring 5のベストプラクティスは何でしょうか?

答えて

1

この質問に答える前にすぐに、voidあなたのメソッドの戻り値の型は、反応的なアプリケーションでは非常に珍しいです。これを見ると、このメソッドは実際の作業を非同期に実行する必要がありますが、このメソッドは同期型を返します。私はその答えをMono<Void>として変更しました。

As stated in the reference documentation、Spring WebFluxは検証をサポートしています。

しかし、ここでは、メソッドパラメータが反応型である可能性があるため、ベストプラクティスが異なります。メソッドパラメータがまだ解決されていない場合、検証結果を得ることはできません。

だから、そのようなことは実際には動作しません:より多くの慣用的な反応性の演算子で使用する方が簡単

// can't have the BindingResult synchronously, 
// as the userCommand hasn't been resolved yet 
public Mono<Void> signup(@Valid Mono<UserCommand> userCommand, BindingResult result) 

// while technically feasible, you'd have to resolve 
// the userCommand first and then look at the validation result 
public Mono<Void> signup(@Valid Mono<UserCommand> userCommand, Mono<BindingResult> result) 

何か:

public Mono<Void> signup(@Valid Mono<UserCommand> userCommand) { 
    /* 
    * a WebExchangeBindException will flow through the pipeline 
    * in case of validation error. 
    * you can use onErrorResume or other onError* operators 
    * to map the given exception to a custom one 
    */ 
      return userCommand.onErrorResume(t -> Mono.error(...)).then(); 
} 
+0

はありがとうを!私の質問をMono に編集しました。私は '@ Valid'がコントローラで働いているのを見ましたが、検証グループ、 '@Validated(SignUpValidation.class)'は動作しません。また、 'MethodValidationPostProcessor'(上記の私の例を参照)を使ってサービスメソッドを検証することはできません。ところで、私はあなたが言及した参考資料を見つけることができませんでした(「参考資料に記載されているように、Spring WebFluxは検証をサポートしています」)。それはどこですか? – Sanjay

+1

私は検証グループがWebFluxでサポートされているとは思いません。これは、公式問題追跡ツール(jira.spring.io)を呼び出す価値があるかもしれません。参照ドキュメントの関連セクションには、入力パラメータの検証のみが記載されています。https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/web-reactive.html#webflux-config-validationを参照してください。 –

関連する問題