0

以下のような単純な JAX-RS Bean があります。

@Path('/client')
class ClientResource {

    @POST
    public Response post(Client client) {
        ...
    }

}

Clientjson レスポンスボディから作成されています。Clientクラスを CDI 対応 Bean にすることは可能ですか? 私はこのようなことをしたいと思います:

class Client {

    @Inject
    private Validator validator;

    public String clientName;    

    public validate() {
       // use validator here
    }
}

デフォルトではvalidatornullになっているので、クライアントが管理されていないようです。

JBoss を RESTEasy とともに Jax-RS 実装として使用しています。

編集

JSON からカスタム マッパーを提供できると思いますが、ボイラープレート コードが多くなるようです。

4

2 に答える 2

0

それはうまくいくはずです。Beanvalが使用できない可能性があります。プロデューサーを作成するか、何か他のものを注入してみてください。

于 2013-01-16T14:04:47.340 に答える
0

アンマーシャリングに JAXB を使用していますか? 私は RESTEasy に詳しくありません。JAXB を使用できるようですが、それが唯一のオプションかどうかはわかりません。

JAXB を使用している場合、Unmarshal Event CallbacksUnmarshallerがサポートされます。非整列化されているオブジェクトのメソッドを呼び出すことも、別のイベント リスナーを呼び出すこともできます。CDI への参照(シンプルな、または JNDI at を介して取得) を持つリスナーを登録できます。リスナーは、それを使用して新しく非整列化されたオブジェクトを注入します。BeanManager@Injectjava:comp/BeanManager

私は決して CDI の専門家ではありませんが、実験によると、これは既に作成されたオブジェクトを挿入しているように見えます。

public class Injector<T> {

    private final BeanManager beanManager;
    private final InjectionTarget<T> injectionTarget;
    private final Bean<T> bean;

    public Injector(BeanManager beanManager, Class<T> cl) {
        this.beanManager = beanManager;
        injectionTarget = beanManager.createInjectionTarget(beanManager.createAnnotatedType(cl));
        bean = resolve(beanManager.getBeans(cl));
    }

    private Bean<T> resolve(Set<Bean<?>> beans) {
        @SuppressWarnings("unchecked")
        Bean<T> bean = (Bean<T>) beanManager.resolve(beans);
        return bean;
    }

    public CreationalContext<T> inject(T obj) {
        CreationalContext<T> creationalContext = beanManager.createCreationalContext(bean);
        injectionTarget.inject(obj, creationalContext);
        return creationalContext;
    }

}

そのコードは、いくつかのクラスの既存のインスタンスを取得し、それに依存関係を注入します。これは CDI のやや不規則な使い方ですが、うまくいくようです (さらに、完全に有効でサポートされていると思います)。

呼び出し元のコードは、返された を保持し、オブジェクトの処理が終了した後でCreationalContextそのメソッドを呼び出す必要があることに注意してください。release

于 2013-01-21T00:56:10.850 に答える