2016-07-22 5 views
5

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

Поэтому я последовал за учебник 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 журналов я получаю следующие Свайные след:

 
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) 

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

+0

Это похоже на ошибку в Джерси для меня, вы должны сообщить об этом здесь: https://java.net/jira/browse/JERSEY/?selectedTab=com.atlassian.jira.jira-projects-plugin:summary -panel – jwells131313

+2

Спасибо за ваш совет. Я сообщил об этой ошибке здесь: https://java.net/jira/browse/JERSEY-3141 –

ответ

0

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

} 
0

Я смог обмануть эту ошибку, введя 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); 
    } 
} 
+0

К сожалению, это не решило мою проблему. Спасибо, в любом случае! –

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^