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

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

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

Ресурс:

@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 ПРЕДУПРЕЖДЕНИЕ [pool-24-thread-1] org.glassfish.jersey.internal.Errors.logErrors Обнаружены следующие предупреждения: ПРЕДУПРЕЖДЕНИЕ: В коде, который выполняет сбой, обнаружен сбой HK2 не запускается в активной области ошибки "Джерси". ВНИМАНИЕ: Обнаружен неизвестный сбой HK2: стек MultiException 1 из 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.internalLetjatorImpIserl (Service) (Service Services).:765) по адресу org.jvnet.hk2.internal.ServiceLocatorImpl.getUnqualifiedService(ServiceLocatorImpl.java:772) по адресу org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:11server.java:11serser.java:11ser.er.g.gser). Org.internal.inject.AbstractContainerRequestValueFactory.getContainerRequest(AbstractContainerRequestValueFactory.java:71) в org.glassfish.jersey.server.internal.inject.PathParamValueFactoryProvider$PathParamValueFactory.aver.Player.Ware 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.jv.internal.ClazzCreator.create(ClazzCreator.java:357) в org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) в org.jvnet.hk2.internal.PerLookupContext.findOrCreateteLj.) в org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022) в org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:114) в org.jvnet.hk2.internal.SlH.getService(ServiceHandleImpl.java:88) в org.jvnet.hk2.internal.FactoryCreator.dispose(FactoryCreator.java:175) в org.jvnet.hk2.internal.SystemDescriptor.dispose(SystemDescriptor.java:526) в org.glass.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.AbstractBaseReseses 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:16u. java) concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) в java.lang.Thread.run(Thread.java:745 Multi) 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.incriptSource (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.FisoryjreatorCreator 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.jer sey.server.ServerRuntime $ AsyncResponder.resume (ServerRuntime.java:922) в de.moss.ems.rest.resource.AbstractBaseResource.send(AbstractBaseResource.java:118) в de.moss.ems.rest.resource.AbstractBaseResource. резюме (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.javaur11til.java:11u. ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) в java.lang.Thread.run(Thread.java:745) Стек MultiException 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.cr eate (SystemDescriptor.java:471) в org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70) в org.jvnet.hk2.internal.Utilities.createService (Utilities.java:2022v) в орг..hk2.internal.ServiceHandleImpl.getService (ServiceHandleImpl.java:114) в org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:88) в org.jvnet.hk2.internal.Coris: 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.AbstractBaseRe source.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.runWecer (поток). java.11 concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) в java.lang.Thread.run(Thread.java:745)

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

3 ответа

Решение

Я смог решить эту проблему с помощью HK2 org.glassfish.hk2.api.PerLookup Аннотация вместо трикотажных изделий 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;
  }

}

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

Я смог обойти эту ошибку, введя 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);
    }
}
Другие вопросы по тегам