我有一个action:  MyAction,在applicationContext中定义如下:<bean id="myAction" class="com.mycompany.demo.action.MyAction"/>
在struts.xml中定义action如下: <package name="demo" extends="json-default">
<!-- {1}:module name  {2}:action name  --> 
<action name="*/*" class="{2}"> 
<result name="success">/jsp/{1}/{2}.jsp</result>
</action>
</package>
这样,如果我希望访问:http://localhost:8080/demo/x/myAction.action的时候.
x对应的是{1}, myAction对应的是{2}页面报错:Struts Problem Report
Struts has detected an unhandled exception: Messages: 
Unable to instantiate Action, , defined for 'myAction' in namespace '/' 
 
File: org/apache/catalina/loader/WebappClassLoader.java 
Line number: 1,386 
--------------------------------------------------------------------------------Stacktraces
Unable to instantiate Action, , defined for 'myAction' in namespace '/' 
    com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:300)
    com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:381)
    com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:187)
    org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
    org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
    com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:467)
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:467)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
    org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    java.lang.Thread.run(Unknown Source)
    
java.lang.ClassNotFoundException: 
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1386)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1232)
    com.opensymphony.xwork2.util.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:147)
    com.opensymphony.xwork2.ObjectFactory.getClassInstance(ObjectFactory.java:94)
    com.opensymphony.xwork2.spring.SpringObjectFactory.getClassInstance(SpringObjectFactory.java:193)
    com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:127)
    com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:137)
    com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:107)
    com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:281)
    com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:381)
    com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:187)
    org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
    org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
    com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:467)
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:467)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
    org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    java.lang.Thread.run(Unknown Source)
    --------------------------------------------------------------------------------You are seeing this page because development mode is enabled. Development mode, or devMode, enables extra debugging behaviors and reports to assist developers. To disable this mode, set:   struts.devMode=falsein your WEB-INF/classes/struts.properties file. 意思不知道我的myAction从哪来的.我把struts.xml文件改一下,改成: <package name="demo" extends="json-default">
<!-- {1}:module name  {2}:action name  --> 
<action name="*/*" class="com.mycompany.demo.{2}Action"> 
<result name="success">/jsp/{1}/{2}.jsp</result>
</action>
</package>
这样,访问:http://localhost:8080/demo/x/MyAction.action的时候.
x对应的是{1}, MyAction对应的就是com.mycompany.demo.MyAction.
这样,就能访问了.
这说明.spring没有对class="myAction"及时的初始化. 请问这是为什么?

解决方案 »

  1.   

    <constant name="struts.objectFactory" value="spring" />
    创建工作交给spring管理了吗?没有的话加上看看
      

  2.   

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Struts Blank</display-name>
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <login-config>
    <auth-method>BASIC</auth-method>
    </login-config>
    </web-app>
      

  3.   

    action的配置里加namespace="{1}"试一试
      

  4.   

    struts2与spring整合的话 需要一个包  struts2-spring-plugin-2.1.6.jar  的,并且其他struts2.0的版本必须与这个jar包一致, 不知道是不是jar包的问题呢
      

  5.   

    struts2与spring整合的话 需要一个包  struts2-spring-plugin-2.1.6.jar  的,并且其他struts2.0的版本必须与这个jar包一致, 不知道是不是jar包的问题呢
      

  6.   


    没.我在struts.properties里声明了:struts.objectFactory = spring现在情况是这样:如果action name="*/*" class={2},就不行.
    如果action name = "*" class={1},就OK
    用第一种方式的话,老说命名空间错. 命名空间我从来就没用过.
    它应该是把第一个"*"当成命名空间了~
     
      

  7.   

    Messages: 
    Unable to instantiate Action, , defined for 'myAction' in namespace '/' 
    很清楚了,在spring的bean中的那个action名称前面没有加'/'
    spring的bean的id属性名称应该和struts的action的name属性名称相同,spring才能找到那个类帮你IOC
      

  8.   

    你的action的配置的时候。前面指定了一个路径,struts.xml的namespace="/x"可以指定的让action的name就等于你的action名称即可
      

  9.   

    我用struts2 做的毕设,一个action也遇到同样的问题, 
    我按网上所说,不要在成员变量或者是构造方法里调用ActionContext,而把它放在其它方法里. 
    于是我把ServletActionContext放到getters中, 
    public Long getEnterNumber() { 
    if(enterNumber == null  ) { 
    enterNumber = Long.parseLong((String)(ServletActionContext.getRequest().getParameter("enterNumber"))); 

    return enterNumber; 

    问题依然存在,不知道还有什么原因会导致该问题的呢