1

ストックルームと職場で構成される JAX-RS アプリを作成しています。ストックルームには、(AJAX を介して) インスタンス化できる Java クラスのセットがあり、職場でこれらのクラスの名前付きインスタンスを作成できます。

これまでのところ、RestEasy アプリケーションで「シングルトン」として宣言することで、倉庫と職場をうまく参照できます。

    singletons.add(StockPlace.getInstance());
    singletons.add(WorkPlace.getInstance());

ストックルームのコンテンツ クラスの処理方法を理解する方法がわかりません。私が達成しようとしている効果は、倉庫クラスの 1 つのインスタンスを動的に作成すると、REST コマンドを介してそのインスタンスに動的にアクセスできるようになることです。私はさまざまな順列を試しました:

    classes.add(SomeComponent.class);

クラスがインスタンスを作成するためのファクトリとしてどのように機能するか、およびこれらの両方がRestEasyがクラス、シングルトン(シングルトンはクラスですが、RestEasyはそれらをインスタンスとして登録します)およびリソース(インスタンス?)。

新しいインスタンスを動的に登録する必要が生じると思いますが、それを行う方法も見つかりません。ServletContext を指定してそれを行う方法を見つけましたが、それにアクセスすることもできません。誰かが私を正しい軌道に乗せることができますか?

4

3 に答える 3

1

この質問に対する私たちの最終的な答えは、RestEasy から抜け出し、DropWizard に変換することでした。その問題と他の多くの問題が消え、すべてが再び簡単になりました.

于 2012-12-24T20:40:31.780 に答える
0

RestEasyに複雑さの別のレイヤー全体(Spring)をストラップすることを含まない答えは見つからなかったので、私が住みやすいと思った解決策は、上記の最後のコメントに概説されています。つまり、アプリが本当にステートレスでない限り(たとえば、インスタンスがメッセージ間で持続しない場合)、インスタンスへのリモートメッセージの送信に依存しないでください。リモートメッセージは、リクエスト間で持続するシングルトンにのみ送信してください。このような各メッセージは、目的のインスタンスを識別でき(私の場合は文字列IDで)、シングルトンは識別されたインスタンスに通常のPOJOとして転送できます。

RestEasyが非シングルトン(インスタンス)を一時的なものとして無条件に扱う理由はまだわかりません。ステートレスはRESTの制限ではなく、GETメソッドを使用できる場合(べき等呼び出し)の制限のみです。PUTおよびPOST呼び出しは、ステートレスでもべき等でもありません。

もちろん、私はこれを理解しているので、遠慮なく訂正してください。私の焦点は、このアプリを放送することであり、RestEasy、RESTの隅々を探索することではなく、確かにSpringではありません。

于 2012-05-06T18:14:40.553 に答える
0

私はあなたが何を求めているか知っていると信じていますが、少なくとも正しい方向にあなたを後押しする必要があります.

アノテーション付きの RESTEasy クラスをレジストリに追加する必要があります。以下は、最近のプロジェクトで使用したクラスです。シングルトンに追加されますが(何をしたかによって)、レジストリにも追加されます。

public class RESTEasyServerApplication extends javax.ws.rs.core.Application
{
    // The RESTEasy registry
    @Autowired
    protected org.jboss.resteasy.spi.Registry registry;

    // The annotated RESTEasy handler classes
    private Set<Object>  singletons = new HashSet<Object>();
    private List<Object> handlers   = new ArrayList<Object>();

    public RESTEasyServerApplication()
    {}

    @Override
    public Set<Object> getSingletons()
    {
        return singletons;
    }

    // Spring injection support
    public void setHandlers( List<Object> handlers )
    {
        for( Object handler : handlers )
        {
            if( registry != null )
            {
                // Save a reference to the handler
                this.handlers.add( handler );

                // Register the handler with RESTEasy
                registry.addSingletonResource( handler );
            }

            singletons.add( handler );
        }
    }

    // Spring injection support
    public List<Object> getHandlers()
    {
        return handlers;
    }
}

私はSpringを使用しました。関連する構成は次のとおりです。

<!-- RESTeasy/Spring integration -->
<import resource="classpath:springmvc-resteasy.xml" />

<!-- RESTeasy server application -->
<bean id="application" class="blah.blah.resteasy.RESTEasyServerApplication">
    <property name="handlers">
        <list>
            <!-- Application specific handler classes -->
            <ref bean="sample"/>
        </list>
    </property>
</bean>

メソッドを簡単に変更/追加して、単一のアノテーション付き RESTEasy クラスを受け入れ、必要に応じて動的に機能させる必要があります。レジストリーは springmvc-resteasy.xml ファイルで定義されています。

于 2012-04-12T03:00:01.770 に答える