gpt4 book ai didi

java - 无法嵌套自定义 Jersey 提供程序

转载 作者:行者123 更新时间:2023-12-01 14:42:11 26 4
gpt4 key购买 nike

当我尝试从另一个自定义提供程序引用一个自定义提供程序时,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(){};
}
};
}
}
}

给了我异常(exception)

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

我做错了什么,还是 Jersey 不支持这种行为?

最佳答案

更合适的问题应该是:Jersey 1.17 不支持此行为吗?

我不想玩猜谜游戏,所以我只能告诉你,用 Jersey 2 就可以做到。

为什么它在1.17中不起作用?也许是因为 Child 依赖项在提供程序注册期间不可用。

Jersey 2 使用 JSR-330,即 @Inject,所有这些以及做你想做的事情的方法就是使用 javax.inject.Provider .

然后,您将使用某种绑定(bind)器来注册可注入(inject)项,但在使用 Provider 时跳过所有详细信息,您不希望在注册期间注入(inject) T。稍后将在 Provider#get

期间检索它

请求范围过滤器的示例:

@Inject
private Provider<ResourceInfo> resourceInfo;

如果我只想做这些:

@Inject
ResourceInfo resourceInfo

那么它就会失败,就像它对你来说失败一样。

如果你可以升级到2,那么我认为这是值得的。

关于java - 无法嵌套自定义 Jersey 提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15840723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com