【问题标题】:EJB injection in Servelet failed with " Resolution should not happen via injection container"Servlet 中的 EJB 注入失败,并显示“不应通过注入容器进行解析”
【发布时间】:2011-07-10 17:42:16
【问题描述】:

我有一个带有一个 ejb jar 和 web 模块的 EAR 文件。 EJB jar 包含一个无状态 Ejb 和本地接口

@Stateless(name="MsgProducer")
@Local(MsgProducerLocal.class)
public class MsgProducer implements MsgProducerLocal {
 public void sendMessage{}
}

现在我有一个 servlet,我在其中注入带有 @EJB 注释的会话 bean,但是当我在 jboss 5.1 中部署这个带有 ejb jar 和 web.war 模块的 EAR 时,它会抛出以下异常。

java.lang.IllegalStateException: Resolution should not happen via injection container
        at org.jboss.web.tomcat.service.TomcatInjectionContainer.getEjbJndiName(TomcatInjectionContainer.java:640)
        at org.jboss.injection.EjbEncInjector.inject(EjbEncInjector.java:80)
        at org.jboss.web.tomcat.service.TomcatInjectionContainer.populateEnc(TomcatInjectionContainer.java:482)
        at org.jboss.web.tomcat.service.deployers.TomcatDeployment$EncListener.lifecycleEvent(TomcatDeployment.java:471)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4388)
        at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310)
        at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142)
        at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
        at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
        at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
        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 org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
        at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
        at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
        at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
        at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
        at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
        at $Proxy38.start(Unknown Source)

在我的 web.xml 中,我使用的是 2.5 版本的架构。这是我来自servelet的示例代码

public class MessageSenderServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @EJB(name="MsgProducer")
    public MsgProducerLocal producer;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public MessageSenderServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        producer.sendMessage();
        response.sendRedirect("index.jsp");
    }

}

我正在使用 Eclipse 3.6、JBoss 5.1 和 EJB 3.0。

有人能解释一下这段代码有什么问题吗? 我该如何解决这个错误?

谢谢

【问题讨论】:

    标签: eclipse jboss ejb-3.0


    【解决方案1】:

    您是否将 Servlet 放入 .WAR 文件中? 注意:您应该将 Servlet 放在 .war 文件中,将 ejb 放在 jar 文件中。然后创建一个ear文件。

    如果你只实现一个接口,那么你不必使用@EJB(name="MsgProducer") .你可以简单地说@EJB public MsgProducerLocal producer;

    正如您所提到的,您拥有 web.xml 版本 2.5。请确保您使用的格式正确。

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2011-04-20
      • 2021-02-26
      • 1970-01-01
      相关资源
      最近更新 更多