各位大神,,小弟遇到一个问题,困扰了下午了
问题是,目前使用的是ssh框架,然后ajax访问后台action的requestTodoListByMOA的方法,这个方法的返回类型是ActionForward的,问题就在这里,我想把返回类型改成JSONObject,因为前台要json对象,但是我改了之后会报错,报错如下
[ERROR] 2017-08-22 17:59:26,609 org.apache.struts.actions.DispatchAction - Action[/moaAction] invalid return type for method 'requestTodoListByMOA'
java.lang.ClassCastException: net.sf.json.JSONObject cannot be cast to org.apache.struts.action.ActionForward
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:276)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:196)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.basic.common.XssFilter.doFilter(XssFilter.java:19)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.jav我也不知道是什么原因,我现在把我的action和配置文件贴出来,大神帮我瞅瞅这是action(引入的service和set、get被我在这删掉了)
public class MoaAction extends DispatchAction  {
/**
 * 获取待办列表的方法
 * 
 * @param mapping
 * @param form
 * @param request
 * @param response
 * @return
 * @throws IOException
 * @throws ParseException 
 */
public JSONObject requestTodoListByMOA(ActionMapping mapping,ActionForm form, 
HttpServletRequest request, HttpServletResponse response) throws IOException, ParseException {

System.out.println("-----------------------------------------change--------------------------------------");
Long beginTime = System.currentTimeMillis(); // 加载页面的起始时间戳
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmss");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
//User su = (User) request.getSession().getAttribute("User");
String userAccount = request.getParameter("userId");
//String userAccount = su.getSysUser().getAccount();
String pageNum = request.getParameter("pageNum"); // 页码
String pageCount = request.getParameter("pageCount"); // 每页条数
String flag = request.getParameter("flag");//0:待办 1:已办
String timeStamp = request.getParameter("timeStamp");
Date timeStampDate = null;
PrintWriter writer = response.getWriter();
String message = null;
try {
int currentPage = 1;
int rowCount = 100;
if (!COMMON.isEmpty(pageNum)) {
currentPage = Integer.valueOf(pageNum);
}
if (!COMMON.isEmpty(pageCount)) {
rowCount = Integer.valueOf(pageCount);
}
// 计算分页
int startPos = (currentPage - 1) * rowCount + 0;
int endPos = currentPage * rowCount;
// 筛选手机端需要的业务类型
/*String sql = "select CODE from SYS_DIC_ITEM where KIND='businessType' ";
List typeList = (List) workFlowTemplateService.findBySQLFilter(sql);
String businessType = typeList.toString().replace("[", "'").replace("]", "'").replaceAll(", ", "','");*/
//拼接查询条件
String filter = " and jh.BUSINESSTYPE_  in ('provDailyAdjustType','dailyAdjustType','dailyAdjustType_same','oddAdjustTypeNo','oddAdjustTypeUn')  and jh.current_<>jh.DRAFTER_  ";
String userId =""; //登录用户id
Map todolist  = new HashMap();//拼接表头
Map top = new HashMap();//拼接表头
if(!COMMON.isEmpty(userAccount)){
String hql = "from SysUserVOImpl where account=?";
List<SysUserVOImpl> userList = sysUserService.getSysUserDAO()
.getHibernateTemplate().find(hql, userAccount);
if (null != userList && userList.size() > 0) {
userId = userList.get(0).getUserId();
} else {
todolist.put("todolist", "");
top.put("responsecode", "0");
top.put("responsemessage", "用户不存在!");
top.put("response", todolist);
writer.print(JSONObject.fromObject(top));
writer.flush();
writer.close();
return null;
}
} else {
todolist.put("todolist", "");
top.put("responsecode", "0");
top.put("responsemessage", "用户名为空!");
top.put("response", todolist);
writer.print(JSONObject.fromObject(top));
writer.flush();
writer.close();
return null;
}
List jsonList = new ArrayList(); // 存放todolist子集数据
List list = null;
if(flag=="0"||"0".endsWith(flag)){
if(timeStamp==null||"".equals(timeStamp)){
list = workFlowTemplate.findWorkItemByActorId(userId,filter, startPos, endPos);
}else{
timeStampDate = sdf.parse(sdf.format(Long.valueOf(timeStamp)));
// 查询待办信息
list = workFlowTemplate.findWorkItemByActorIdNew(userId,filter, startPos, endPos,timeStampDate);
}
}else{
if(timeStamp==null||"".equals(timeStamp)){
list = workFlowTemplate.findUnWorkItemByActorId(userId, filter, startPos, endPos, null);
}else{
timeStampDate = sdf.parse(sdf.format(Long.valueOf(timeStamp)));
//查询已办
list = workFlowTemplate.findUnWorkItemByActorIdNew(userId, filter, startPos, endPos, null,timeStampDate);
}
}
if (null != list && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
JbpmWithdrawalHelpVOImpl temp = (JbpmWithdrawalHelpVOImpl) list
.get(i);
Map map = new HashMap();//存放todolist里面的详情
map.put("taskId", String.valueOf(temp.getTaskId()));
map.put("businessId", temp.getBusinessId());
map.put("flowTitle", temp.getTitle());
map.put("flowName", temp.getName());
map.put("submitName", temp.getFromActorName());

String start = temp.getStart()==null?null:sdf1.format(temp.getStart());
map.put("submitTime", start);
if(timeStamp==null||"".equals(timeStamp)){
map.put("timeStamp", df.format(beginTime));
}else{
map.put("timeStamp", timeStamp);
}
if("oddAdjustTypeNo".equals(temp.getBusinessType())||"oddAdjustTypeUn".equals(temp.getBusinessType())){
map.put("batchSumbit", false);
}else{
map.put("batchSumbit", true);
}
System.out.println("--------------------------------------"+df.format(temp.getCreate())+"----------------------------------");
jsonList.add(map);
}
}
todolist.put("todolist", jsonList);
todolist.put("listSize", list.size());
top.put("responsecode", "1");
top.put("responsemessage", "success");
top.put("response", todolist);
JSONObject jsonArray2 = JSONObject.fromObject(top);
return jsonArray2;
} catch (Exception e) {
message = e.getMessage();
e.printStackTrace();
} finally {
if (null != writer) {
try {
if (null != message) {
Map todolist  = new HashMap();//拼接表头
Map top = new HashMap();//拼接表头
todolist.put("todolist", "");
top.put("responsecode", "0");
top.put("responsemessage", "查询待办列表信息出错!");
top.put("response", todolist);
writer.print(JSONObject.fromObject(top));
}
writer.flush();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.println("=====查询代办列表执行速度(毫秒):======"
+ (System.currentTimeMillis() - beginTime));
return null;
}下面是spring-action的配置的配置xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans> <bean name="/moaAction" class="com.eskytech.budget.moa.MoaAction">
<property name="workFlowTemplate" ref="workflowTemplate" />
<property name="workFlowTemplateService" ref="workFlowTemplateService" />
<property name="sysUserService" ref="sysUserService" />
<property name="sysOrgService" ref="sysOrgService"/>
<property name="bdgtSubjDeptService" ref="bdgtSubjDeptService"/>
<property name="dprojBudgetService" ref="dprojBudgetService" />
<property name="dailyBudgetHiAdjustService" ref="dailyBudgetHiAdjustService"/>
<property name="dailyBudgetAdjustDAO" ref="dailyBudgetAdjustDAO" />
<property name="dailyBudgetAdjustService" ref="dailyBudgetAdjustService" />
<property name="budgetIndexHiAdService" ref="budgetIndexHiAdService" />
<property name="bItemCommentService" ref="bItemCommentService" />
<property name="budgetExamineHiService" ref="budgetExamineHiServiceImpl"/>
<property name="pojoTemplateService" ref="workFlowTemplateService" />
<property name="budgetDetailHiAdService" ref="budgetDetailHiAdService" />
<property name="templateParseTransition" ref="templateParseTransitionService" />
<property name="messagePushService" ref="messagePushService" />
<property name="jbpmWorkFlowUtils" ref="jbpmWorkFlowUtils" />
</bean></beans>这是struts-config.xml的配置<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
    <form-beans>
<form-bean name="baseForm" type="com.basic.common.BaseForm" />
<form-bean name="tInquirybudgetinfosrvForm" type="com.eskytech.budget.ws.append.vo.TInquirybudgetinfosrvVOImpl"/>
</form-beans>
<global-forwards>
<forward name="error" path="/system/query/error.jsp" />
</global-forwards>
<action-mappings> <action path="/moaAction" scope="request" parameter="method"
type="org.springframework.web.struts.DelegatingActionProxy">
</action>

</action-mappings>


</struts-config>然后我就不知道为啥报错了

解决方案 »

  1.   

    用的是struts1???
      

  2.   

    N年前用过struts1,基本忘了
    但你可以尝试
    1.返回值改成void
    2.将jsonObject转成json字符串,然后response写进流,大概如下代码 response.setCharacterEncoding("UTF-8");
             response.setContentType("application/json");
             response.setHeader("progma", "no-cache");
                response.setHeader("Cache-Control", "no-cache");
                response.setDateHeader("Expires", 0);
             PrintWriter pw = response.getWriter();
    String text = JSON.toJSONString(restObject);
    pw.write(text);
    pw.close();
      

  3.   

    建议 action这样配置
        <package name="resultJson" namespace="/" extends="json-default">
            <action name="resultJson" class="com.mz.action.JsonAction">
                <result name="success" type="json">
                    <!--root是ognl表达式的一部分不能更换  -->
                    <param name="root">user</param>
                </result>
            </action>
        </package>
      

  4.   

    struts 就算是 2,现在用的也少了。我好早前有用过,当时的方法就跟楼上差不多,将 json 以流的形式刷出去就行了。其实异步和同步,原理是一样的,同步的话你返回一个模板,也是到了模板解析器,然后解析出 html 内容刷出去。
      

  5.   

    以前在学校用的就是struts1,返回类型改成ActionForward 
    将json对象放到PrintWriter,最后return null。
      

  6.   

    ObjectMapper mapper = new ObjectMapper();  
            //User类转JSON   
            String json = mapper.writeValueAsString(insertbbxx);   
            return json; 
    我是这么做的,对象转json
      

  7.   

    首先  Ajax  调用的action  ,不需要你的方法定义返回类型,定义void 也可以。  定义String 或者 其他  ,最终return null ,Ajax接受的值 通过 writer.print(JSONObject.fromObject(top).toString );
    前台ajax 参数定义dataType:  json