【问题标题】:HK2 failure has been detected in a code that does not run in an active Jersey Error scope在未在活动 Jersey 错误范围内运行的代码中检测到 HK2 故障
【发布时间】:2016-07-22 15:29:16
【问题描述】:

目前我正在开发一个基于球衣的 RESTful 应用程序,并希望在我的资源中使用 DPI。 (注:jersey 版本为 2.23.1,servlet 容器为 tomcat 8.5.3。)

因此,我按照球衣文档中的教程Chapter 23. Custom Injection and Lifecycle Management 创建了一个资源、一个工厂并将工厂绑定到这样的类:

资源:

@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 绑定到我的 Project 类。

@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 日志中,我得到了以下堆栈跟踪:

2016 年 7 月 22 日 16:29:46.510 警告 [pool-24-thread-1] org.glassfish.jersey.internal.Errors.logErrors 检测到以下警告:警告:在执行以下操作的代码中检测到 HK2 故障不在活动的 Jersey 错误范围内运行。 警告:检测到未知的 HK2 故障: 多异常堆栈 1 of 3 java.lang.IllegalStateException:不在请求范围内。 在 jersey.repackaged.com.google.common.base.Preconditions.checkState(Preconditions.java:173) 在 org.glassfish.jersey.process.internal.RequestScope.current(RequestScope.java:233) 在 org.glassfish.jersey.process.internal.RequestScope.findOrCreate(RequestScope.java:158) 在 org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022) 在 org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:765) 在 org.jvnet.hk2.internal.ServiceLocatorImpl.getUnqualifiedService(ServiceLocatorImpl.java:772) 在 org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:111) 在 org.glassfish.jersey.server.internal.inject.AbstractContainerRequestValueFactory.getContainerRequest(AbstractContainerRequestValueFactory.java:71) 在 org.glassfish.jersey.server.internal.inject.PathParamValueFactoryProvider$PathParamValueFactory.provide(PathParamValueFactoryProvider.java:93) 在 org.glassfish.jersey.server.internal.inject.ParamInjectionResolver.resolve(ParamInjectionResolver.java:134) 在 org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:211) 在 org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:234) 在 org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:357) 在 org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) 在 org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70) 在 org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022) 在 org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114) 在 org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88) 在 org.jvnet.hk2.internal.FactoryCreator.dispose(FactoryCreator.java:175) 在 org.jvnet.hk2.internal.SystemDescriptor.dispose(SystemDescriptor.java:526) 在 org.glassfish.jersey.process.internal.RequestScope$Instance.remove(RequestScope.java:532) 在 org.glassfish.jersey.process.internal.RequestScope$Instance.release(RequestScope.java:549) 在 org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:968) 在 org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:922) 在 de.moss.ems.rest.resource.AbstractBaseResource.send(AbstractBaseResource.java:118) 在 de.moss.ems.rest.resource.AbstractBaseResource.resume(AbstractBaseResource.java:165) 在 de.moss.ems.rest.resource.catalog.CatalogsResource.handleGet(CatalogsResource.java:49) 在 de.moss.ems.rest.resource.catalog.AbstractCatalogResource.lambda$asyncGetRequest$0(AbstractCatalogResource.java:44) 在 java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 多异常堆栈 2 of 3 java.lang.IllegalArgumentException:在尝试解决 de.moss.ems.rest.factory.ProjectFactory 的依赖项时发现错误 在 org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:246) 在 org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:357) 在 org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) 在 org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70) 在 org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022) 在 org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114) 在 org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88) 在 org.jvnet.hk2.internal.FactoryCreator.dispose(FactoryCreator.java:175) 在 org.jvnet.hk2.internal.SystemDescriptor.dispose(SystemDescriptor.java:526) 在 org.glassfish.jersey.process.internal.RequestScope$Instance.remove(RequestScope.java:532) 在 org.glassfish.jersey.process.internal.RequestScope$Instance.release(RequestScope.java:549) 在 org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:968) 在 org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:922) 在 de.moss.ems.rest.resource.AbstractBaseResource.send(AbstractBaseResource.java:118) 在 de.moss.ems.rest.resource.AbstractBaseResource.resume(AbstractBaseResource.java:165) 在 de.moss.ems.rest.resource.catalog.CatalogsResource.handleGet(CatalogsResource.java:49) 在 de.moss.ems.rest.resource.catalog.AbstractCatalogResource.lambda$asyncGetRequest$0(AbstractCatalogResource.java:44) 在 java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 多异常堆栈 3 之 3 java.lang.IllegalStateException:无法执行操作:解决 de.moss.ems.rest.factory.ProjectFactory 在 org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:386) 在 org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) 在 org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70) 在 org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022) 在 org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114) 在 org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88) 在 org.jvnet.hk2.internal.FactoryCreator.dispose(FactoryCreator.java:175) 在 org.jvnet.hk2.internal.SystemDescriptor.dispose(SystemDescriptor.java:526) 在 org.glassfish.jersey.process.internal.RequestScope$Instance.remove(RequestScope.java:532) 在 org.glassfish.jersey.process.internal.RequestScope$Instance.release(RequestScope.java:549) 在 org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:968) 在 org.glassfish.jersey.server.ServerRuntime$AsyncResponder.resume(ServerRuntime.java:922) 在 de.moss.ems.rest.resource.AbstractBaseResource.send(AbstractBaseResource.java:118) 在 de.moss.ems.rest.resource.AbstractBaseResource.resume(AbstractBaseResource.java:165) 在 de.moss.ems.rest.resource.catalog.CatalogsResource.handleGet(CatalogsResource.java:49) 在 de.moss.ems.rest.resource.catalog.AbstractCatalogResource.lambda$asyncGetRequest$0(AbstractCatalogResource.java:44) 在 java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745)

有什么办法可以解决这个警告吗?

【问题讨论】:

标签: java dependency-injection jersey jersey-2.0 hk2


【解决方案1】:

当我将工厂绑定到接口时,我能够在我的 AbstractBinder 类中使用 HK2 的 org.glassfish.hk2.api.PerLookup Annotation 而不是 Jerseys org.glassfish.jersey.process.internal.RequestScoped Annotation 来解决这个问题。

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;
  }

}

【讨论】:

    【解决方案2】:

    我能够通过注入 Factory 而不是直接类来解决这个错误。我还使用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);
        }
    }
    

    【讨论】:

    • 不幸的是,这并没有解决我的问题。还是谢谢!
    【解决方案3】:

    您可以检查您无法使用 Jersey“导入”的类中的某个方法是否存在语法错误,对我来说就是这种情况。我在一个字符串中有两个未闭合的加号。

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多