简体   繁体   English

泽西岛:注入工作在资源方法中,但不适用于EJB属性

[英]Jersey: Injection works in resource method, but not for a EJB attribute

I have a custom InjectionProvider which retrieves a User object from the SecurityContext and makes it available. 我有一个自定义的InjectionProvider,可以从SecurityContext检索User对象并使它可用。 A custom ResourceFilter performs the HTTP Basic authentication, creates the SecurityContext and populates it with a Principal. 定制的ResourceFilter执行HTTP基本身份验证,创建SecurityContext并使用Principal进行填充。 This is based on this suggestion . 基于此建议

When I access it from a resource method, it works as expected: 当我从资源方法访问它时,它按预期工作:

@Stateless
@Path("foo")
public class FooResource {

  @GET
  @ResourceFilters(value = {UserAuthenticationFilter.class})
  public Response get(@Context User user) {
    return Response.ok().entity(user).build();
  }
}

However, when I try to inject the object as an attribute/field to the EJB, exceptions get thrown, even though I can see in the logs that the InjectionProvider gets called: 但是,当我尝试将对象作为EJB的属性/字段注入时,会抛出异常, 即使我在日志中看到调用了InjectionProvider的情况也是如此:

@Stateless
@Path("foo")
public class FooResource {

  @Context
  private User user;

  @GET
  @ResourceFilters(value = {UserAuthenticationFilter.class})
  public Response get() {
    return Response.ok().entity(user).build();
  }
}

The exception is strange: 异常很奇怪:

[#|2011-10-31T13:35:47.691+0000|WARNING|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=18;_ThreadName=Thread-3;|StandardWrapperValve[Gateway Servlet]: PWC1406: Servlet.service() for servlet Gateway Servlet threw exception
javax.ejb.CreateException: Could not create stateless EJB
    at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:534)
    at com.sun.ejb.containers.StatelessSessionContainer.access$000(StatelessSessionContainer.java:95)
    at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:724)
    at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:247)
    at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:449)
    at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2528)
    at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1895)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
    at $Proxy166.get(Unknown Source)
....
Caused by: com.sun.jersey.spi.inject.Errors$ErrorMessagesException
    at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
    at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
    at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199)
    at com.sun.jersey.server.impl.application.WebApplicationImpl$ComponentProcessorFactoryImpl.get(WebApplicationImpl.java:499)
    at com.sun.jersey.server.impl.ejb.EJBInjectionInterceptor.get(EJBInjectionInterceptor.java:104)
    at com.sun.jersey.server.impl.ejb.EJBInjectionInterceptor.init(EJBInjectionInterceptor.java:71)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCallback(SystemInterceptorProxy.java:133)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.init(SystemInterceptorProxy.java:120)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.ejb.containers.interceptors.CallbackInterceptor.intercept(InterceptorManager.java:964)
    at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:65)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:393)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:376)
    at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:526)
    ... 55 more

What am I doing wrong? 我究竟做错了什么?

EDIT : I just noticed that before the exception is thrown, an error is reported in the server.log: 编辑 :我只是注意到,在引发异常之前,server.log中报告了一个错误:

[#|2011-10-31T15:33:01.854+0000|SEVERE|glassfish3.1.1|com.sun.jersey.spi.inject.Errors|_ThreadID=18;_ThreadName=Thread-3;|The following errors and warnings have been detected with resource and/or provider classes:
  SEVERE: Missing dependency for field: private com.skalio.bonusapp.core.User com.skalio.bonusapp.gateway.FooResource.user|#]

This is due to a scope mismatch. 这是由于示波器不匹配造成的。 You are trying to inject a request-scoped thing to a bean that is not request scoped. 您正在尝试将请求范围的事物注入到没有请求范围的Bean中。 That won't work. 那行不通。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM