2017-10-18 6 views
0

私はJersey 2でSpring 4を使用しようとしていましたが、jersey-spring3拡張を使用すると、@Named Springによって管理される注釈付きリソースを作成できません。これらは、Springが管理するために@Componentという注釈を付ける必要があります。Jersey 2 + SpringでのJSR-330アノテーションの使用

リソースに@Namedと注釈が付けられている場合、HK2はそのリソースを管理することを「引き継ぐ」ようです。次の春のApplicationContext起動

Oct 18, 2017 3:11:44 PM org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init> 
INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 
Oct 18, 2017 3:11:44 PM com.example.jersey.webapp.Resource init 
INFO: Creating -> [email protected] injected with -> [email protected] 
Oct 18, 2017 3:11:45 PM org.springframework.web.context.ContextLoader initWebApplicationContext 
INFO: Root WebApplicationContext: initialization completed in 249 ms 

とのカップルの後に印刷され、次のログメッセージに

<?xml version="1.0" encoding="UTF-8"?> 
<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" 
    default-init-method="init"> 

    <context:component-scan base-package="com.example.jersey.webapp"/> 
    <bean id="greeting" class="com.example.jersey.spring.Greeting"/> 
</beans> 

結果と

リソース

import com.example.jersey.spring.Greeting; 
import java.util.logging.Logger; 
import javax.inject.Inject; 
import javax.inject.Named; 
import javax.inject.Singleton; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

@Named 
@Singleton 
@Path("resource") 
public class Resource { 

    private static final Logger logger = Logger.getLogger("Resource"); 

    public void init() { 
     logger.info("Creating -> " + this + " injected with -> " + greeting); 
    } 

    @Inject 
    private Greeting greeting; 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getIt() { 
     logger.info("Working on " + this + " Greeting " + greeting); 
     return "Got it!"; 
    } 
} 

GETコール。

Oct 18, 2017 3:11:56 PM com.example.jersey.webapp.Resource getIt 
INFO: Working on [email protected] Greeting [email protected] 
Oct 18, 2017 3:12:03 PM com.example.jersey.webapp.Resource getIt 
INFO: Working on [email protected] Greeting [email protected] 

だから、SpringはBeanを作成するように見えますが、これは要求を処理するために使用されたものではありません。ただし、Namedの代わりにComponentを使用すると、ライフサイクル全体がSpringによって管理されます。

標準@Namedアノテーションを使用して、Springがリソースのライフサイクルを完全に管理する方法はありますか?

答えて

0

私はHK2を無効にする方法はないと思います。最新Jersey-2 Userguideから

リソースが@Component、@Service、@Controllerまたは@Repository

春はもっとの使用を推奨して注釈を付けることで、春で自分自身を管理する必要があります@Service,@Controllerおよび@Repositoryです。 Spring 4.3.12 Documentation §7.10.1から

@Component、さらにステレオタイプアノテーション

@Repositoryアノテーション(としても知られているリポジトリの 役割またはステレオタイプを満たす任意のクラスのマーカーでありますデータアクセスオブジェクト またはDAO)。このマーカーの使用法の中には、第20.2.2項「例外変換」で説明した 例外の自動変換があります。

スプリングでは、@ Component、@Service、 、および@Controllerというさらなるステレオタイプアノテーションが提供されています。 @Componentは、 Spring管理コンポーネントの一般的なステレオタイプです。 @Repository、@Service、および@Controllerは、 の例では、パーシスタンス層、サービス層、プレゼンテーション層のそれぞれの具体的な使用例については、それぞれ @Componentの特殊化です。 です。したがって、コンポーネントクラスに @Componentで注釈を付けることができますが、代わりに@Repository、@Service、または @Controllerで注釈を付けることで、クラスは のツールによる処理またはアスペクトとの関連付けに適しています。たとえば、これらの ステレオタイプ注釈は、ポイントカットの理想的なターゲットを作成します。 @Repository、@Service、および@ControllerがSpring Frameworkの将来のリリースで の追加のセマンティクスを運ぶ可能性もあるので、 も可能です。したがって、 サービス層の@Contentまたは@Serviceを使用するかどうかを選択する場合は、@Serviceが明らかに良い選択です。同様に、前述の のように、@Repositoryは、パーシスタンス層の 自動例外変換のマーカーとしてすでにサポートされています。

関連する問題