Сбой HK2 обнаружен в коде, который не выполняется в активной области ошибки Джерси.

В настоящее время я разрабатываю приложение RESTful на основе трикотажа и хотел бы использовать DPI в своих ресурсах. (Примечание: версия трикотажа — 2.23.1, а контейнер сервлета — tomcat 8.5.3.)

Поэтому я следовал руководству Глава 23. Пользовательское внедрение и управление жизненным циклом в документации Джерси. и создал ресурс, фабрику и привязал фабрику к классу следующим образом:

Ресурс:

@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 я получаю следующую трассировку стека:

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$0(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$0(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$0(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)

Любые идеи, как я могу решить эти предупреждения?


person Sebastian Frey    schedule 22.07.2016    source источник
comment
Для меня это похоже на ошибку в Джерси, вам, вероятно, следует сообщить об этом здесь: java.net/jira/browse/JERSEY/   -  person jwells131313    schedule 23.07.2016
comment
Спасибо за совет. Я сообщил об этой ошибке здесь: java.net/jira/browse/JERSEY-3141   -  person Sebastian Frey    schedule 25.07.2016


Ответы (3)


Я смог решить эту проблему, используя аннотацию org.glassfish.hk2.api.PerLookup HK2 вместо аннотации Jerseys org.glassfish.jersey.process.internal.RequestScoped в моем классе AbstractBinder, когда я привязывал свою фабрику к своему интерфейсу.

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

}
person Sebastian Frey    schedule 05.10.2016

Я смог обойти эту ошибку, внедрив 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);
    }
}
person user3707125    schedule 10.09.2016
comment
К сожалению, это не решило мою проблему. Спасибо, в любом случае! - person Sebastian Frey; 05.10.2016

Вы можете проверить, есть ли у вас синтаксическая ошибка в одном из ваших методов в классе, который вы не можете «импортировать» с помощью Джерси, для меня это было так. У меня было два незамкнутых плюса в строке.

person Vitali Pom    schedule 17.08.2017