2016-07-22 48 views
5

Şu anda jersey tabanlı RESTful bir uygulama geliştiriyorum ve kaynaklarımda DPI kullanmak istiyorum. (Not: formanın Sürüm 2.23.1 ve servlet konteyner erkek kedi 8.5.3.) Bundan dolayı ben jersey dokümanlarında öğretici Chapter 23. Custom Injection and Lifecycle Management takip etti ve bir kaynak, bir fabrika oluşturulan ve bir sınıfa fabrika bağlamakHK2 hatası etkin bir Jersey'de çalışmayan bir kodda algılandı Hata

böyle:

Kaynak:

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

    @Inject 
    Project project; 

    ... 
} 

Fabrika: Ayrıca

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

} 

Ben bir özelliği var ki kaydeder ProjectFactory'yi proje sınıfımma bağlayan bir AbstractBinder.

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

} 

benim Kaynak herşey yolunda arayıp benim proje örneğini erişebilir zaman aslında sorundur, ama benim erkek kedi catalina günlüklerinde i aşağıdaki Stacke iz alıyorum:

 
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) 

Herhangi bu uyarıları nasıl çözebilirim?

+0

Bu, Jersey'deki bir hataya benziyor, muhtemelen şu adrese bildirmelisiniz: https://java.net/jira/browse/JERSEY/?selectedTab=com.atlassian.jira.jira-projects-plugin:summary -panel – jwells131313

+2

Tavsiyeniz için teşekkürler. Bu hatayı burada bildirdim: https://java.net/jira/browse/JERSEY-3141 –

cevap

0

Aracım için fabrikam.

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

Bu hata, doğrudan sınıf yerine Factory enjekte ederek bu sorunu çözebildi. Ayrıca HttpServletRequest enjeksiyon ile test ettim ve de çalışır. Ancak @PathParam ya da benim için başka herhangi bir akıllı açıklama benim için işe yaramadı, bu yüzden büyük olasılıkla onların kullanımı geçici olarak gerekecektir.

Eski kodu:

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

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

Benim yeni kod: Ben bağlamak benim AbstractBinder sınıfında Formalar yerine org.glassfish.jersey.process.internal.RequestScoped Ek Açıklama hK2 en org.glassfish.hk2.api.PerLookup Ek Açıklama kullanarak bu sorunu çözmek başardı

@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

Ne yazık ki bu benim problemimi çözmedi. Yine de teşekkürler! –

0

Eğer Jersey'de ile değil "ithal" can sınıfta yöntemlerden birinde bir sözdizimi hatası olup olmadığını kontrol edebilirsiniz, benim için bu böyleydi. Bir dizede iki kapanmamış artı vardı.