2016-03-23 11 views
2

私はジャージー(2.22.2)を使い慣れていますので、私に同行してください。私は、ユーザーデータの保存、削除、および取得のためにLDAPサーバーとインターフェイスするRESTサービスを作成しています。このサービスは、暗号化/復号化を実行することによってセキュリティ仲介者として機能します。Javaジャーナル2でシングルトンを初期化するJAX-RS

RESTサービスを利用するには、初期化がかなり必要ですが、この初期化は1回だけ実行してください(アプリケーションがサーバーにデプロイされている場合)。したがって、このサービスはシングルトンとして実行されます。

誰かが私にこれを行う最善の方法についてのいくつかの指針を与えることができたらうれしいですか?ありがとう!

答えて

1

ユーザSpring Framework。

ここ

https://projects.spring.io/spring-framework/

https://jersey.java.net/documentation/latest/spring.html

あり、完全な作業例:

https://github.com/jersey/jersey/tree/2.22.2/examples/helloworld-spring-webapp

あなたは基本的にあなたのジャージーのプロジェクトに、この依存関係を追加し、それが自動的に春が含まれます:

 <dependency> 
      <groupId>org.glassfish.jersey.ext</groupId> 
      <artifactId>jersey-spring3</artifactId> 
      <version>${project.version}</version> 
     </dependency> 

その後、あなたはapplicationContext.xmlをというファイルにあなたのSpring Beanを定義し、SRC /メイン/リソース:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd"> 

    <bean id="mySingletonService" class="com.test.MyService"/> 
<beans/> 

なく、少なくとも最後に、あなたの実際のリソースで、あなたは@Autowireアノテーションを使用して、このシングルトンサービスを注入することができます:

@SingletonResourceを使用してリソース内の状態を初期化することは、恐ろしい、ひどいアイデアです。懸念の分離は重要であり、RESTリソース内の状態を維持することはちょっと面倒です。 let(LDAPResourceとLDAPService)を作成することで、インタフェース(REST)とビジネスロジックを扱うコードを分けることができます。 Springがここで演じる部分は、そうでなければ自分自身をインスタンス化する必要のある配線だけです。

+0

これは良い回答ではありません。 Spring Frameworkを使用するだけで、ユーザーの質問にどのように対処するのか説明せずにいくつかのドキュメントにリンクしています。 – DavidS

+0

@DavidS Springはこれのためのより良いフレームワークになりますか?私はジャージーを撤去することを意味していても、これに最も適したものは何でもあります。 – Wes

+0

@Wes、Springはフレームワークであり、多くのユースケースをサポートしています。 JerseyはRESTサービスを作成するための小さなライブラリです。私はあなたの未来を予測することはできませんが、ジャージーだけで始めます。私の答えはSpringがこの時点で不要な依存関係になることを示していると思います。Jerseyは既にあなたがしたいことをサポートしています。 – DavidS

5

Jersey 2.22.2には、リソースのライフサイクルを変更するための組み込みサポートがあります。 @Singletonアノテーションを使用できます。公式文書のJAX-RS Application, Resources and Sub-Resources: Life-cycle of Root Resource Classesでそれを読んでください。単純に初期化コードをリソースのデフォルトのコンストラクタに入れてください。

  • 範囲:シングルトン
  • 注釈:@Singleton
  • 注釈完全なクラス名:JAX-RSアプリケーションごと インスタンスが1つだけ存在し、この範囲でjavax.inject.Singleton

。シングルトンリソースは に@Singletonでアノテートされ、そのクラスは Applicationのインスタンスを使用して登録できます。 でSingletonインスタンスをApplicationに登録することで、シングルトンを作成することもできます。

例:上記の例で

package com.airhacks; 
import java.util.Date; 
import javax.inject.Singleton; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.Response; 

@Path("/hello") 
@Singleton 
public class HelloWorldService { 

    public HelloWorldService() throws InterruptedException { 
     // Some expensive initialization goes here. 
     Thread.sleep(5000); 
     System.out.println("Initialized at " + new Date()); 
    } 

    @GET 
    public Response getMsg() { 
     String output = "Hello world at " + new Date(); 
     return Response.status(200).entity(output).build(); 
    } 

} 

は、最初の要求はGlassfishの3に遅延初期化のために5秒を要し、その後、後続のすべての要求がすぐに役立ちました。

0

サービスができるだけ早く開始されるように、@ Singtonではなく@Immediateを使用できます。 Jerseyがデフォルトでイミディエイトコンテキストを開始していないときに問題が発生しましたが、これで解決されたと思います。

+0

これが機能していることを確認しましたか?私はそれを見つけ、この[公開チケット](https://java.net/jira/browse/JERSEY-2291)を見つけました。 – DavidS

+0

それはまだ開いているように私に見えますが、hk2はそれを修正することはできません、それはジャージーレベルで修正する必要があります。私はそれについてジャージーの男と話しましょう – jwells131313

関連する問題