2013-04-05 27 views
0

當我嘗試從另一個自定義提供程序引用某個自定義提供程序時,Jersey會引發異常。無法嵌套自定義Jersey提供程序

這個測試用例

public class NestedProvidersTest extends JerseyTest { 
    public NestedProvidersTest() throws TestContainerException { 
     super(new LowLevelAppDescriptor.Builder(new DefaultResourceConfig(Resource.class, ParentProvider.class, ChildProvider.class)).build()); 
    } 

    @Test public void test() { 
     resource().path("/").get(String.class); 
    } 

    @Path("/") public static class Resource { 
     @Context private Parent parent; 

     @GET public String get() { 
      return "hello"; 
     } 
    } 

    public interface Parent {} 
    public interface Child {} 

    @Provider public static class ParentProvider extends PerRequestTypeInjectableProvider<Context, Parent> { 
     @Context private Child child; 

     public ParentProvider() { 
      super(Parent.class); 
     } 

     @Override public Injectable<Parent> getInjectable(ComponentContext ic, Context context) { 
      return new Injectable<Parent>() { 
       @Override public Parent getValue() { 
        return new Parent(){}; 
       } 
      }; 
     } 
    } 

    @Provider public static class ChildProvider extends PerRequestTypeInjectableProvider<Context, Child> { 
     public ChildProvider() { 
      super(Child.class); 
     } 

     @Override public Injectable<Child> getInjectable(ComponentContext ic, Context context) { 
      return new Injectable<Child>() { 
       @Override public Child getValue() { 
        return new Child(){}; 
       } 
      }; 
     } 
    } 
} 

讓我異常

Apr 05, 2013 7:02:41 PM com.sun.jersey.test.framework.spi.container.grizzly2.GrizzlyTestContainerFactory$GrizzlyTestContainer <init> 
INFO: Creating low level grizzly2 container configured at the base URI http://localhost:9998/ 
Apr 05, 2013 7:02:41 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate 
INFO: Initiating Jersey application, version 'Jersey: 1.17.1 02/28/2013 12:47 PM' 
Apr 05, 2013 7:02:43 PM com.sun.jersey.spi.inject.Errors processErrorMessages 
SEVERE: The following errors and warnings have been detected with resource and/or provider classes: 
    SEVERE: Missing dependency for field: private NestedProvidersTest$Child NestedProvidersTest$ParentProvider.child 

com.sun.jersey.test.framework.spi.container.TestContainerException: com.sun.jersey.spi.inject.Errors$ErrorMessagesException 
    at com.sun.jersey.test.framework.spi.container.grizzly2.GrizzlyTestContainerFactory$GrizzlyTestContainer.<init>(GrizzlyTestContainerFactory.java:106) 
    at com.sun.jersey.test.framework.spi.container.grizzly2.GrizzlyTestContainerFactory.create(GrizzlyTestContainerFactory.java:77) 
    at com.sun.jersey.test.framework.JerseyTest.getContainer(JerseyTest.java:345) 
    at com.sun.jersey.test.framework.JerseyTest.<init>(JerseyTest.java:220) 
    at NestedProvidersTest.<init>(NestedProvidersTest.java:22) 
[snip] 
Caused by: com.sun.jersey.spi.inject.Errors$ErrorMessagesException 
    at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170) 
    at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136) 
    at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:770) 
    at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:172) 
    at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:134) 
    at com.sun.jersey.test.framework.spi.container.grizzly2.GrizzlyTestContainerFactory$GrizzlyTestContainer.<init>(GrizzlyTestContainerFactory.java:102) 
    ... 29 more 

我做得不對,或者是這種行爲不被支持的球衣?

回答

1

更合適的問題應該是: is this behavior not supported by Jersey 1.17?

我不想玩猜謎遊戲,所以我只能告訴你,它可以與新澤西2.

做,爲什麼它不工作在1.17?也許是因爲Child依賴項在提供程序註冊期間不可用。

Jersey 2使用@Inject的JSR-330,所有這一切以及做你想做的事情的方法是使用javax.inject.Provider

然後,您將使用某種活頁夾註冊注射劑,但在使用提供程序時跳過所有的細節,您不希望在註冊期間注入T。

@Inject 
private Provider<ResourceInfo> resourceInfo; 

如果我想只是這些幹什麼:這將稍後在Provider#get

來自實例請求範圍過濾器檢索

@Inject 
ResourceInfo resourceInfo 

那麼它會失敗,就像它沒有爲你。

如果你可以升級到2,那麼我認爲這是值得的。

+0

對不起,我應該說我在澤西島1.17.1測試了這個 – hertzsprung 2013-04-10 08:55:23

相關問題