在不 运行 活跃的 Jersey 错误范围的代码中检测到 HK2 故障
HK2 failure has been detected in a code that does not run in an active Jersey Error scope
目前我正在开发一个基于球衣的 RESTful 应用程序并且想在我的资源中使用 DPI。
(注:jersey的版本是2.23.1,servlet容器是tomcat8.5.3。)
因此我遵循了 jersey 文档中的教程 Chapter 23. Custom Injection and Lifecycle Management 并创建了一个资源、一个工厂并将工厂绑定到 class,如下所示:
资源:
@Path("/{project}/catalogs")
public class ProjectsResource {
@Inject
Project project;
...
}
工厂:
public class ProjectFactory extends Factory<Project> {
private final Cache cache = cache.getInstance();
@PathParam("project")
private String project;
private HttpServletRequest request;
@Inject
public ProjectFactory(HttpServletRequest request) {
this.request = request;
}
@Override
public Project provide() {
return cache.get(project, Project.class);
}
@Override
public void dispose(Project instance) {}
}
我还有一个功能,它注册了一个 AbstractBinder,它将我的 ProjectFactory 绑定到我的项目 class。
@Provider
public class ProjectFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(ProjectFactory.class)
.to(Project.class)
.proxy(false)
.proxyForSameScope(true)
.in(RequestScoped.class);
});
return true;
}
}
实际问题是,当我调用我的资源时,一切都很好,我可以访问我的项目实例,但在我的 tomcat catalina 日志中,我得到以下堆栈跟踪:
22-Jul-2016 16:29:46.510 WARNING [pool-24-thread-1] org.glassfish.jersey.internal.Errors.logErrors The following warnings have been detected: WARNING: HK2 failure has been detected in a code that does not run in an active Jersey Error scope.
WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 3
java.lang.IllegalStateException: Not inside a request scope.
at jersey.repackaged.com.google.common.base.Preconditions.checkState(Preconditions.java:173)
at org.glassfish.jersey.process.internal.RequestScope.current(RequestScope.java:233)
at org.glassfish.jersey.process.internal.RequestScope.findOrCreate(RequestScope.java:158)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022)
at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:765)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getUnqualifiedService(ServiceLocatorImpl.java:772)
at org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:111)
at org.glassfish.jersey.server.internal.inject.AbstractContainerRequestValueFactory.getContainerRequest(AbstractContainerRequestValueFactory.java:71)
at org.glassfish.jersey.server.internal.inject.PathParamValueFactoryProvider$PathParamValueFactory.provide(PathParamValueFactoryProvider.java:93)
at org.glassfish.jersey.server.internal.inject.ParamInjectionResolver.resolve(ParamInjectionResolver.java:134)
at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:211)
at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:234)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:357)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471)
at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022)
at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at org.jvnet.hk2.internal.FactoryCreator.dispose(FactoryCreator.java:175)
at org.jvnet.hk2.internal.SystemDescriptor.dispose(SystemDescriptor.java:526)
at org.glassfish.jersey.process.internal.RequestScope$Instance.remove(RequestScope.java:532)
at org.glassfish.jersey.process.internal.RequestScope$Instance.release(RequestScope.java:549)
at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:968)
at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:922)
at de.moss.ems.rest.resource.AbstractBaseResource.send(AbstractBaseResource.java:118)
at de.moss.ems.rest.resource.AbstractBaseResource.resume(AbstractBaseResource.java:165)
at de.moss.ems.rest.resource.catalog.CatalogsResource.handleGet(CatalogsResource.java:49)
at de.moss.ems.rest.resource.catalog.AbstractCatalogResource.lambda$asyncGetRequest[=14=](AbstractCatalogResource.java:44)
at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
MultiException stack 2 of 3
java.lang.IllegalArgumentException: While attempting to resolve the dependencies of de.moss.ems.rest.factory.ProjectFactory errors were found
at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:246)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:357)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471)
at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022)
at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at org.jvnet.hk2.internal.FactoryCreator.dispose(FactoryCreator.java:175)
at org.jvnet.hk2.internal.SystemDescriptor.dispose(SystemDescriptor.java:526)
at org.glassfish.jersey.process.internal.RequestScope$Instance.remove(RequestScope.java:532)
at org.glassfish.jersey.process.internal.RequestScope$Instance.release(RequestScope.java:549)
at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:968)
at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:922)
at de.moss.ems.rest.resource.AbstractBaseResource.send(AbstractBaseResource.java:118)
at de.moss.ems.rest.resource.AbstractBaseResource.resume(AbstractBaseResource.java:165)
at de.moss.ems.rest.resource.catalog.CatalogsResource.handleGet(CatalogsResource.java:49)
at de.moss.ems.rest.resource.catalog.AbstractCatalogResource.lambda$asyncGetRequest[=14=](AbstractCatalogResource.java:44)
at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
MultiException stack 3 of 3
java.lang.IllegalStateException: Unable to perform operation: resolve on de.moss.ems.rest.factory.ProjectFactory
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:386)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471)
at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022)
at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114)
at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88)
at org.jvnet.hk2.internal.FactoryCreator.dispose(FactoryCreator.java:175)
at org.jvnet.hk2.internal.SystemDescriptor.dispose(SystemDescriptor.java:526)
at org.glassfish.jersey.process.internal.RequestScope$Instance.remove(RequestScope.java:532)
at org.glassfish.jersey.process.internal.RequestScope$Instance.release(RequestScope.java:549)
at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:968)
at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:922)
at de.moss.ems.rest.resource.AbstractBaseResource.send(AbstractBaseResource.java:118)
at de.moss.ems.rest.resource.AbstractBaseResource.resume(AbstractBaseResource.java:165)
at de.moss.ems.rest.resource.catalog.CatalogsResource.handleGet(CatalogsResource.java:49)
at de.moss.ems.rest.resource.catalog.AbstractCatalogResource.lambda$asyncGetRequest[=14=](AbstractCatalogResource.java:44)
at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
有什么办法可以解决这个警告吗?
我能够通过注入 Factory
而不是直接注入 class 来解决这个错误。我还测试了 HttpServletRequest
注入,它也能正常工作。然而,没有 @PathParam
或任何其他智能注释对我有用,所以很可能你必须解决它们的使用问题。
我的旧代码:
@Inject
public void setContext(ContainerRequestContext context) {
this.context = context;
}
@Override
public SomeInfo provide() {
return (SomeInfo) context.getProperty(SOME_KEY);
}
我的新密码:
@Inject
public void setContext(Factory<ContainerRequestContext> contextFactory) {
this.contextFactory = contextFactory;
}
@Override
public SomeInfo provide() {
ContainerRequestContext ctx = contextFactory.provide();
try {
return (SomeInfo) ctx.getProperty(SOME_KEY);
} finally {
contextFactory.dispose(ctx);
}
}
当我将我的工厂绑定到我的界面时,我可以通过使用 HK2 的 org.glassfish.hk2.api.PerLookup
注释而不是 Jerseys org.glassfish.jersey.process.internal.RequestScoped
注释 class 来解决这个问题。
import org.glassfish.hk2.api.PerLookup;
@Provider
public class ProjectFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(ProjectFactory.class)
.to(Project.class)
.proxy(false)
.proxyForSameScope(true)
.in(PerLookup.class);
});
return true;
}
}
您可以检查您在 class 中的某个方法中是否有语法错误,您不能 "import" 使用 Jersey,对我来说就是这种情况。我在一个字符串中有两个未闭合的加号。
目前我正在开发一个基于球衣的 RESTful 应用程序并且想在我的资源中使用 DPI。 (注:jersey的版本是2.23.1,servlet容器是tomcat8.5.3。)
因此我遵循了 jersey 文档中的教程 Chapter 23. Custom Injection and Lifecycle Management 并创建了一个资源、一个工厂并将工厂绑定到 class,如下所示:
资源:
@Path("/{project}/catalogs")
public class ProjectsResource {
@Inject
Project project;
...
}
工厂:
public class ProjectFactory extends Factory<Project> {
private final Cache cache = cache.getInstance();
@PathParam("project")
private String project;
private HttpServletRequest request;
@Inject
public ProjectFactory(HttpServletRequest request) {
this.request = request;
}
@Override
public Project provide() {
return cache.get(project, Project.class);
}
@Override
public void dispose(Project instance) {}
}
我还有一个功能,它注册了一个 AbstractBinder,它将我的 ProjectFactory 绑定到我的项目 class。
@Provider
public class ProjectFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(ProjectFactory.class)
.to(Project.class)
.proxy(false)
.proxyForSameScope(true)
.in(RequestScoped.class);
});
return true;
}
}
实际问题是,当我调用我的资源时,一切都很好,我可以访问我的项目实例,但在我的 tomcat catalina 日志中,我得到以下堆栈跟踪:
22-Jul-2016 16:29:46.510 WARNING [pool-24-thread-1] org.glassfish.jersey.internal.Errors.logErrors The following warnings have been detected: WARNING: HK2 failure has been detected in a code that does not run in an active Jersey Error scope. WARNING: Unknown HK2 failure detected: MultiException stack 1 of 3 java.lang.IllegalStateException: Not inside a request scope. at jersey.repackaged.com.google.common.base.Preconditions.checkState(Preconditions.java:173) at org.glassfish.jersey.process.internal.RequestScope.current(RequestScope.java:233) at org.glassfish.jersey.process.internal.RequestScope.findOrCreate(RequestScope.java:158) at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022) at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:765) at org.jvnet.hk2.internal.ServiceLocatorImpl.getUnqualifiedService(ServiceLocatorImpl.java:772) at org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:111) at org.glassfish.jersey.server.internal.inject.AbstractContainerRequestValueFactory.getContainerRequest(AbstractContainerRequestValueFactory.java:71) at org.glassfish.jersey.server.internal.inject.PathParamValueFactoryProvider$PathParamValueFactory.provide(PathParamValueFactoryProvider.java:93) at org.glassfish.jersey.server.internal.inject.ParamInjectionResolver.resolve(ParamInjectionResolver.java:134) at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:211) at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:234) at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:357) at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70) at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022) at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114) at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88) at org.jvnet.hk2.internal.FactoryCreator.dispose(FactoryCreator.java:175) at org.jvnet.hk2.internal.SystemDescriptor.dispose(SystemDescriptor.java:526) at org.glassfish.jersey.process.internal.RequestScope$Instance.remove(RequestScope.java:532) at org.glassfish.jersey.process.internal.RequestScope$Instance.release(RequestScope.java:549) at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:968) at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:922) at de.moss.ems.rest.resource.AbstractBaseResource.send(AbstractBaseResource.java:118) at de.moss.ems.rest.resource.AbstractBaseResource.resume(AbstractBaseResource.java:165) at de.moss.ems.rest.resource.catalog.CatalogsResource.handleGet(CatalogsResource.java:49) at de.moss.ems.rest.resource.catalog.AbstractCatalogResource.lambda$asyncGetRequest[=14=](AbstractCatalogResource.java:44) at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) MultiException stack 2 of 3 java.lang.IllegalArgumentException: While attempting to resolve the dependencies of de.moss.ems.rest.factory.ProjectFactory errors were found at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:246) at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:357) at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70) at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022) at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114) at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88) at org.jvnet.hk2.internal.FactoryCreator.dispose(FactoryCreator.java:175) at org.jvnet.hk2.internal.SystemDescriptor.dispose(SystemDescriptor.java:526) at org.glassfish.jersey.process.internal.RequestScope$Instance.remove(RequestScope.java:532) at org.glassfish.jersey.process.internal.RequestScope$Instance.release(RequestScope.java:549) at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:968) at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:922) at de.moss.ems.rest.resource.AbstractBaseResource.send(AbstractBaseResource.java:118) at de.moss.ems.rest.resource.AbstractBaseResource.resume(AbstractBaseResource.java:165) at de.moss.ems.rest.resource.catalog.CatalogsResource.handleGet(CatalogsResource.java:49) at de.moss.ems.rest.resource.catalog.AbstractCatalogResource.lambda$asyncGetRequest[=14=](AbstractCatalogResource.java:44) at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) MultiException stack 3 of 3 java.lang.IllegalStateException: Unable to perform operation: resolve on de.moss.ems.rest.factory.ProjectFactory at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:386) at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70) at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022) at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114) at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88) at org.jvnet.hk2.internal.FactoryCreator.dispose(FactoryCreator.java:175) at org.jvnet.hk2.internal.SystemDescriptor.dispose(SystemDescriptor.java:526) at org.glassfish.jersey.process.internal.RequestScope$Instance.remove(RequestScope.java:532) at org.glassfish.jersey.process.internal.RequestScope$Instance.release(RequestScope.java:549) at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:968) at org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:922) at de.moss.ems.rest.resource.AbstractBaseResource.send(AbstractBaseResource.java:118) at de.moss.ems.rest.resource.AbstractBaseResource.resume(AbstractBaseResource.java:165) at de.moss.ems.rest.resource.catalog.CatalogsResource.handleGet(CatalogsResource.java:49) at de.moss.ems.rest.resource.catalog.AbstractCatalogResource.lambda$asyncGetRequest[=14=](AbstractCatalogResource.java:44) at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)
有什么办法可以解决这个警告吗?
我能够通过注入 Factory
而不是直接注入 class 来解决这个错误。我还测试了 HttpServletRequest
注入,它也能正常工作。然而,没有 @PathParam
或任何其他智能注释对我有用,所以很可能你必须解决它们的使用问题。
我的旧代码:
@Inject
public void setContext(ContainerRequestContext context) {
this.context = context;
}
@Override
public SomeInfo provide() {
return (SomeInfo) context.getProperty(SOME_KEY);
}
我的新密码:
@Inject
public void setContext(Factory<ContainerRequestContext> contextFactory) {
this.contextFactory = contextFactory;
}
@Override
public SomeInfo provide() {
ContainerRequestContext ctx = contextFactory.provide();
try {
return (SomeInfo) ctx.getProperty(SOME_KEY);
} finally {
contextFactory.dispose(ctx);
}
}
当我将我的工厂绑定到我的界面时,我可以通过使用 HK2 的 org.glassfish.hk2.api.PerLookup
注释而不是 Jerseys org.glassfish.jersey.process.internal.RequestScoped
注释 class 来解决这个问题。
import org.glassfish.hk2.api.PerLookup;
@Provider
public class ProjectFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(ProjectFactory.class)
.to(Project.class)
.proxy(false)
.proxyForSameScope(true)
.in(PerLookup.class);
});
return true;
}
}
您可以检查您在 class 中的某个方法中是否有语法错误,您不能 "import" 使用 Jersey,对我来说就是这种情况。我在一个字符串中有两个未闭合的加号。