2011-03-07 93 views
0

我有一個EAR文件,其中包含一個ejb jar和web模塊。 EJB JAR包含一個無狀態EJB和本地接口Servelet中的EJB注入失敗,「解決方案不應通過注入容器發生」

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

現在我有一個servlet的我在哪裏注射用@EJB註解這個會話Bean,但是當我部署此EAR在兩個EJB JAR和的web.war模塊裏面jboss 5.1然後它拋出以下異常。

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。

有人可以解釋我這個代碼有什麼問題嗎? 我該如何解決這個錯誤?

謝謝

回答

0

您是否將您的Servlet放在.WAR文件中? 注意:您應該將您的Servlet放在.war文件中,並將您的ejb放入jar文件中。然後創建一個ear文件。

如果您只實現一個接口,那麼您不必使用@EJB(name =「MsgProducer」) 。你可以簡單地說@EJB public MsgProducerLocal製作人;

正如你所提到的,你有web.xml版本2.5。請確保您使用的格式正確。

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