1

私は CDI を理解しようとしていますが、現時点ではほとんど結果が得られていません。:( 実際、私はこの例のような Web サービス ファサードに行き詰まっています。

@GET
@Path("/greeting/{name}")
@produces(mediatype.text_plain)
public String sayHello(@PathParam("name") String name)
{
    return "Hello " + name;
}

CDI アノテーションを使用して、文字列がパラメーターとして送信されるたびにサーバー側でチェックを行いたいので、次のようにします: (@NameValidator注釈に注意)

@GET
@Path("/greeting/{name}")
@Produces(mediatype.text_plain)
public String sayHello( @NameValidator @PathParam("name") String name)
{
    return "Hello " + name;
}

検証は、外部クラスで、そのようなものにすることができます:

if (name == "Andrea") {
    throw new Exception();}

それはどのように機能しますか?出来ますか?そうでない場合、代替手段は何ですか?ありがとうございました!アンドレア

4

2 に答える 2

3

CDI のインターセプター アノテーションを使用して、次のようなことを行うことができます。

...
@Validated
public String sayHello(@Validator(MyValidator.class) String name) {
    ...

どこでメソッドをクラスなど@Validatedにバインドします。メソッドとそのパラメーターを使用して、渡されたパラメーターを検査し、それらを検証します。ValidationInterceptor@AroundInvokeInvocationContext

このアプローチの「難しさ」の 1 つは、リフレクションを使用して@Validator注釈と各パラメーターの指定されたバリデーター クラスを取得し、実際の検証を最終的に行う前に、対応するインスタンスを作成/取得する必要があることです。

少し異なるアプローチはInstance<T>、バリデーターの共通のスーパークラス/インターフェースの を に挿入し、パラメーターにバリデーター修飾子ValidationInterceptorで注釈を付けることです。sayHello

// in ValidationInterceptor:

@Inject
private Instance<Validator> validatorInstance;

@AroundInvoke
public Object validate(InvocationContext context) {

    // get Annotation instances for target method parameters
    // ...

    Validator validator =
        validatorInstance.select(annotations).get();

    // ... validator.validate(parameter); ...

}

// sayHello:

...
@Validated
public String sayHello(@NameValidator String name) {
    ...

からパラメータ アノテーションを取得するInvocationContextには、次のようにします。

Annotation[][] annotations = context.getMethod().getParameterAnnotations();

@AfterBeanDiscoveryイベント ハンドラーでこれらの注釈を前処理することも検討してください。

于 2012-06-22T14:26:42.790 に答える
3

その検証の問題については、CDI をHibernate-ValidatorにブリッジするSeam Validationを提案します。これにより、Hibernate エンドの明確に定義された検証 API に引っ掛かり、次のようなコードを記述できるようになります。

public void registerUser(@Valid UserData data) {...};

Seam 3 の依存関係に耐えられない場合は、関連する CDI 拡張のソース コードを簡単に取得できます。これはほんの数十行のコードです。

于 2012-06-22T15:05:20.857 に答える