2016-07-22 119 views
5

Derzeit entwickle ich eine Jersey-basierte RESTful-Anwendung und möchte DPI in meinen Ressourcen verwenden. (Hinweis: Version von Jersey ist 2.23.1 und der Servlet-Container ist tomcat 8.5.3.)HK2-Fehler wurde in einem Code erkannt, der nicht in einem aktiven Jersey-Fehlerbereich ausgeführt wird

Deshalb folgte ich das Tutorial Chapter 23. Custom Injection and Lifecycle Management in der Jersey-Dokumentation und erstellt eine Ressource, eine Fabrik und binde, um die Fabrik zu einer Klasse dies wie:

Ressource:

@Path("/{project}/catalogs") 
public class ProjectsResource { 

    @Inject 
    Project project; 

    ... 
} 

Factory:

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) {} 

} 

auch habe ich eine Funktion, die Register ein AbstractBinder, der meine ProjectFactory an meine Project-Klasse bindet.

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

} 

Das eigentlich Problem ist, wenn ich meine Ressource ist alles in Ordnung rufen, und ich kann mein Projekt-Instanz zugreifen, aber in meinem Kater catalina logs Ich erhalte die folgende stacke Spur:

 
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) 

Beliebig Ideen, wie ich diese Warnungen lösen kann?

+0

Das sieht aus wie ein Fehler in Jersey für mich, sollten Sie es wahrscheinlich hier melden: https://java.net/jira/browse/JERSEY/?selectedTab=com.atlassian.jira.jira-projects-plugin:summary -Panel – jwells131313

+2

Danke für Ihren Rat. Ich habe diesen Fehler hier gemeldet: https://java.net/jira/browse/JERSEY-3141 –

Antwort

0

konnte ich dieses Problem lösen, indem HK2 die org.glassfish.hk2.api.PerLookup Annotation statt Trikots org.glassfish.jersey.process.internal.RequestScoped Annotation in meiner AbstractBinder-Klasse, wenn ich binden meine Fabrik zu meiner Schnittstelle.

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

Ich konnte um diesen Fehler umgehen, indem ich anstelle der direkten Klasse Factory injiziert. Ich habe auch mit HttpServletRequest Injektion getestet und es funktioniert auch. Allerdings funktioniert keine @PathParam oder andere intelligente Annotation für mich, so dass Sie wahrscheinlich um ihre Verwendung umgehen müssen.

Mein alter Code:

@Inject 
public void setContext(ContainerRequestContext context) { 
    this.context = context; 
} 

@Override 
public SomeInfo provide() { 
    return (SomeInfo) context.getProperty(SOME_KEY); 
} 

Mein neuer Code:

@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

Leider löste das mein Problem nicht. Danke trotzdem! –

0

Sie können überprüfen, ob Sie einen Syntaxfehler in einem Ihre Methoden in der Klasse haben, können Sie nicht „Import“ mit Jersey, für mich war dies der Fall. Ich hatte zwei unverschlossene Pluszeichen in einer Saite.