2017-07-05 8 views
2

私はRESTful Webサービスを構築しようとしています。このコンポーネントは、既にいくつかのサーブレットを含む既存のTomcat 7 Webアプリケーションに追加されています。私はJersey 2.25を使用しています。TomcatサーブレットとしてJAX-RS(Jersey)リソースにシングルトンを注入

私は、既存のシステムに関連するいくつかのコンポーネント(オブジェクト)をインスタンス化する必要があります。私は、アプリケーションがロードされている間、一度それをしたいと思うし、各リソースからそれらを読み込むより。

私の現在のクラスは次のとおりです。

public class MyService { 
    String name; 

    public MyService() { 
     name = "John"; 
    } 

    public String getName() { 
     return name; 
    } 
} 

とリソース::私ができる

@Path("Person") 
public class PersonResource { 


    @Inject 
    private MyService service;  

    @GET 
    public String test() { 
     String result = "Hello!"; 

     return result; 
    } 
} 

」これは私がシングルトンとして使用するクラスがある

@ApplicationPath("resources") 
public class MyApplication extends ResourceConfig { 

    public MyApplication() { 
     packages("plc_webservice.PersonResource"); 

     register(new MyBinder()); 
    } 
} 

public class MyBinder extends AbstractBinder{ 

    @Override 
    protected void configure() { 
     bind(new MyService()).to(MyService.class); 
    } 
} 

なぜこの例外が発生するのかわからない:

javax.servlet.ServletException:MultiExceptionには3つの例外があります。 これらは次のとおりです。 1. org.glassfish.hk2.api.UnsatisfiedDependencyException: のSystemInjecteeImpl(requiredType = MyService、parent = PersonResource、修飾子= {}、position = -1、optional = false、 2. pll_webservice.PersonResourceの依存関係を解決しようとしましたが、エラーが見つかりました 3. java.lang.IllegalStateException:操作を実行できません:plc_webserviceで解決してください。 PersonResource

org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:489) org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) かg.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) org.glassfish.jersey.servlet.ServletContainer.service( ServletContainer.java:228) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 根本原因

マルチ例外には3つの例外があります。それらは次のとおりです。 1. org.glassfish.hk2.api.UnsatisfiedDependencyException: のSystemInjecteeImpl(requiredType = MyService、parent = PersonResource、修飾子= {}、position = -1、optional = false、self)には、 = false、unqualified = null、1688478701) 2. java.lang.IllegalArgumentException:plc_webservice.PersonResourceの依存関係を解決しようとしたときにエラーが発生しました 3. java.lang.IllegalStateException:操作を実行できません:plc_webservice.PersonResourceで解決

org.jvnet.hk2.internal.Collector.throwIfErrors(Collector.java:89) org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:250) org.jvnet.hk2.internal。 ClazzCreator。 create(ClazzCreator.java:358) org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:487) org.glassfish.jersey.process.internal.RequestScope.findOrCreate(RequestScope.java:162) 組織(ServiceLocatorImpl。)。Javaの:774) org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:737) org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:707) org.glassfish.jersey.internal .inject.Injections.getOrCreate(Injections.java:172) org.glassfish.jersey.server.model.MethodHandler $ ClassBasedMethodHandler.getInstance(MethodHandler.java:284) org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter (RoutingStage.java:109) .java:112) org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.jav a:112) org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:92) org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:61) org.glassfish.jersey.process.internal.Stages.process(Stages.java:197) org.glassfish.jersey .server.ServerRuntime $ 2.run(ServerRuntime.java:318) org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:271) org.glassfish.jersey.internal.Errors $ 1.call(エラー。 java:267) org.glassfish.jersey.internal.Errors.process(Errors.java:315) org.glassfish.jersey.internal.Errors.process(Errors.java:297) org.glassfish.j irc.process.internal.Errors.process(Errors.java:267) org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime。 (WebComponent.java:473) org.glassfish.jersey.servlet .WebComponent.service(WebComponent.java:427) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) org.apache.tomcat.we bsocket.server.WsFilter.doFilter(WsFilter.java:52) org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 根本原因

org.glassfish.hk2。 api.UnsatisfiedDependencyException: SystemInjecteeImpl(requiredType = MyService、parent = PersonResource、修飾子= {}、位置= -1、オプション= false、self = false、unqualified = null、1688478701)で、 オブジェクトを注入できませんでした。 (ClazzCreator.java:212) org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator。 java:235) org.jvnet.hk2.internal.Cla (RequestScope.java:162)。 org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022) org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:774) org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService (ServiceLocatorImpl.java:737) org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:707) org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:172) org。org。 。クラス。メソッド。(RoutingStage.java:109) org.glassfish.jersey.server.internal.routing.RoutingStage._apply(java:284) org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) org.glassfish .jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:92) org.glassfish.jersey.server .internal.routing.RoutingStage.apply(RoutingStage.java:61) org.glassfish.jersey.process.internal.Stages.process(Stages.java:197) org.glassfish.jersey.server.ServerRuntime $ 2.run(ServerRuntime.java:318) org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:271) org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:267) org.glassfish.jersey.internal.Errors.process(Errors.java:315) org.glassfish.jersey.internal.Errors.process(Errors.java:297) 組織.glassfish.jersey.internal.Errors.process(Errors.java:267) org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) org.glassfish.jersey.server.ServerRuntime.process (ServerRuntime.java:305) org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java (WebComponent.java:427) (ServletContainer.java:228) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

ありがとうございました。

答えて

0

これはCDIの問題だと思います。 beans.xmlが定義されていますか?また、MyServiceをシングルトンにしたい場合は、@ApplicationScopedと注釈を付けたいと思います。

+0

または@ Singletonとバインドに追加 – jwells131313

+0

私はResourceConfigオブジェクトを構築する方法を変更し、それが機能しました。私はそれが何らかのビルドの問題だと思う。コードは同じで、今動作します。 –

0

最初に注入されたリソース(豆)とジャージーエンドポイントクラス(注入点)はCDI対応でなければなりません。それはCDIによって検出可能でなければならない。 Bean-discovery-mode = "all" - CDIスキャンALLクラスまたは bean-discovery-mode = "annotated"を使用して、私たちのクラスにPROPERアノテーションを付けます:ここから:Bean defining annotations。私は従属@好むか

はその後、我々はHK2ディスカバリメカニズムとCDIを接続するために

<dependency> 
    <groupId>org.glassfish.jersey.ext.cdi</groupId> 
    <artifactId>jersey-cdi1x-servlet</artifactId> 
    <version>{version}</version> 
    <scope>runtime</scope> 
</dependency> 

`

ジャージー拡張

を使用する必要があります@RequestScoped。 ここにあります Official oracle Guideline

関連する問題