在本地eclipse里面可以正常运行,可是放到集成服务器上面编译部署到tomcat之后,调用LoginAction时就会报错:org.apache.struts2.dispatcher.ServletDispatcherResult cannot be cast to com.opensymphony.xwork2.Result - action - file:/usr/local/tomcat/webapps/agile2012/WEB-INF/classes/struts.xml:30:57
com.opensymphony.xwork2.DefaultActionInvocation.createResult(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:368)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:278)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:510)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)root causejava.lang.ClassCastException: org.apache.struts2.dispatcher.ServletDispatcherResult cannot be cast to com.opensymphony.xwork2.Result
com.opensymphony.xwork2.ObjectFactory.buildResult(ObjectFactory.java:228)
com.opensymphony.xwork2.DefaultActionInvocation.createResult(DefaultActionInvocation.java:221)
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:368)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:278)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:510)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)

解决方案 »

  1.   

    是不是少什么Jar包了 建议对比下本地和服务器上的 Jar包。。
      

  2.   

    谢谢大家的回帖,今天起来看了下正常了,很诡异有木有我想问下java EE运行时用到的jar包有几个地方啊?
    jre是一个;WEB-INF下面的lib是一个;Tomcat容器的lib是一个。还有别的么?我按照一楼的对比了下WEB-INF中jar包的数量和版本都是一样的啊,还有需要注意的地方么?struts.xml:30行就是一个action的定义:
     <action name="login" class="action.LoginAction">
    <result name="success" >/course/course_list.html</result>
    <result name="error">error.jsp</result>
     </action>LoginAction的代码也一并贴一下吧:package action;import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import model.Access;
    import model.Person;
    import model.dao.AccessDAO;
    import model.dao.PersonDAO;
    import model.dao.PersonRoleDAO;
    import model.dao.RoleAccessDAO;
    import model.dao._RootDAO;
    import model.dao.KeyWordDAO;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends ActionSupport {
    /**
     * 
     */
    private static final long serialVersionUID = 1L; private PersonDAO personDAO;
    private PersonRoleDAO personRoleDAO;
    private RoleAccessDAO roleAccessDAO;
    private AccessDAO accessDAO;
    private KeyWordDAO keywordDAO;

    private Person person;

    private String username;
    private String password;
    private List<Integer> roleList;
    private List<Integer> accessIDList;
    private List<Access> accessItemList;
    private List<String> accessString;

    public String getUsername() {
    return username;
    } public void setUsername(String username) {
    this.username = username;
    } public String getPassword() {
    return password; 
    } public void setPassword(String password) {
    this.password = password;
    } @SuppressWarnings("unchecked")
    public String execute(){
    _RootDAO.initialize();
    personDAO = new PersonDAO();

    person = new Person();
    person.setName(username);
    person.setPassword(password);

    person = personDAO.check(person);

    if(person!=null){

    ActionContext ac=ActionContext.getContext();
    Map sess=ac.getSession();
    sess.put("uid",person.getId());

    roleList = new ArrayList<Integer>();
    accessIDList = new ArrayList<Integer>();
    accessItemList = new ArrayList<Access>();
    accessString = new ArrayList<String>();

    personRoleDAO = new PersonRoleDAO();
    roleAccessDAO = new RoleAccessDAO();
    accessDAO = new AccessDAO();
    keywordDAO = new KeyWordDAO();


    roleList = personRoleDAO.getRoleByPersonID(person.getId());

    for(Integer roleID:roleList)
    accessIDList.addAll(roleAccessDAO.getAccessByRoleID(roleID));

    for(Integer accessID:accessIDList)
    accessItemList.addAll(accessDAO.getAccessByID(accessID));

    for(Access accessItem:accessItemList)
    {
    accessString.add((keywordDAO.get(Integer.valueOf(accessItem.getSource())).getContent())
    +(keywordDAO.get(Integer.valueOf(accessItem.getOperation())).getContent()));
    }

    sess.put("access",accessString);

    return SUCCESS;
    }
    this.addFieldError("password", "invalid username or password");
    return ERROR;

    }}
    虽然莫名奇妙的可以了,但是还是想知道为什么啊,谢谢各位了!
      

  3.   

    今天又debug了半天,终于发现时jdk版本的原因。本地是jdk6,服务器是jdk7,导致类型转化的时候出现异常。jdk7很多方面都比较严格,ssh框架中的annotation机制也被限制了。不知道是要自己设置jdk的约束级别还是就这样一刀切了谢谢大家哈~
      

  4.   

    thanks.了解了。打破了我对高版本jdk的迷信。