3

REST と Jersey は初めてなので、いくつかの基本的な例を試しています。ただし、まだ答えが見つかっていない特定の質問が 1 つあります (これを探す方法がよくわかりません)。共通サービスステートフルでアクセス可能にするために、どのように保存/定義しますか?すべて/一部のリソースに?

たとえば、ロガー インスタンス (Log4J など)。これを手動で初期化して HttpSession に保存する必要がありますか? ロガーがすべて/一部のリソースにアクセスできるように、これを行う「ベストプラクティス」の方法はありますか?

4

2 に答える 2

2

最良のオプションは、Spring などを使用してリソースにサービスを注入することです。特定のサービスのリソースにセッターを追加すると、さまざまなスコープで利用できるようになります。次のチュートリアルでは、Spring と Jersey の使用方法について詳しく説明しています。以下は、これを機能させるために必要なさまざまな要素の例です。具体的にあなたの質問に答えますが、「ベストプラクティス」は、Spring が特定のサービスの「ステートフル」または「スコープ」を管理できるようにすることです。

単純なサービス Bean

public class SimpleBean {
    private int counter;
    public String sayHello() {  
        return Integer.toString(counter++);
    }  
}

単純な JAX-RS リソース

public class HelloWorldResource {

    private SimpleBean simpleBean;

    public void setSimpleBean(SimpleBean simpleBean) {
        this.simpleBean = simpleBean;
    }

    @GET @Path("/Hello") @Produces(MediaType.APPLICATION_JSON)
    public String sayHello() {
        return "{\"Hello\": \"" + this.simpleBean.sayHello() + "\"}";
    }
}

単純な Spring の applicationContext.xml で、Bean とリソースの「スコープ」に注意してください。これは、これらのオブジェクトがどの程度ステートフルであるかを定義します。

<bean id="simpleBean" scope="prototype" class="myhealth.spring.SimpleBean"/>

<bean id="helloWorldResource" scope="singleton" class="myhealth.ajax.HelloWorldResource">
    <property name="simpleBean">
        <ref bean="simpleBean"/>
    </property>
</bean>
于 2010-05-19T20:23:50.277 に答える
2

ロガーについて厳密に言えば、それをステートフルにしたいですか? 私が行ってきたほとんどのプロジェクトは、必要なクラスで1つを取得するだけです

Logger log = Logger.getLogger(this.getClass().getName());

それをカット アンド ペーストして、ロギングの魔法を始めましょう!

状態の保持に関する最初の質問: ユーザーごとにステートフルなもの (セッションなど) を保持したり、アプリケーション全体で他の状態 (ランタイム構成のロガーなど) を保持したりしますか? セッションは、HttpRequest と一部の ServletFilter で管理できます。次のようにJErseyコードでリクエストを取得します

@Path("/awesome")
public class AwesomeService {

    @GET
    @Produces("text/awesome")
    public String getAwesome(@Context HttpServletRequest req) {   
        HttpSession session= req.getSession(true);
        //brilliance
    }
}

エンティティ マネージャーや konfabulator などのアプリケーション リソースは、静的に初期化して、シングルトンとして、またはファクトリと共に使用できます。

class EntityManager { 
EntityManager manager;
public static EntityManager getManager() {
        if(manager == null) {
            manager = initManager();
        }
        return manager;
    }
}
于 2010-05-19T14:44:11.560 に答える