You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liferay 7.3中MVC Resource Command执行结果如何被JavaScript正确识别

问题原因

  • MVCResourceCommand的serveResource方法返回的布尔值不控制HTTP响应状态:返回true只是告诉Liferay继续执行后续匹配到的其他ResourceCommand,返回false表示终止命令链,不管返回什么值,只要服务端正常接收到请求并完成处理,默认HTTP响应状态都是200
  • XMLHttpRequest的onerror只会在网络层面请求失败时触发:比如跨域被拦截、DNS解析失败、连接超时、服务器完全无响应等,只要服务端返回了响应(哪怕是4xx、5xx状态码),都会走onload回调

解决方法

方案1:服务端设置HTTP状态码,前端判断响应状态

捕获异常时给响应设置非2xx的错误状态码,前端直接判断状态即可:

import javax.servlet.http.HttpServletResponse;

public boolean serveResource(
        ResourceRequest resourceRequest, ResourceResponse resourceResponse) {    
 try {
   // 你的业务代码
   resourceResponse.setStatus(HttpServletResponse.SC_OK);
   return false;
 }catch(Exception e){
  // 出错时设置500错误状态码
  resourceResponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  return true;
 }
}

前端onload回调中新增状态判断:

req.onload = function (event) {
    if (req.status >= 200 && req.status < 300) {
        console.log("success");
    } else {
        console.log("error");
    }
}

方案2:响应体返回业务状态标识,前端解析判断

不需要修改HTTP状态码的场景,可以在响应中返回自定义业务状态:

import java.io.PrintWriter;

public boolean serveResource(
        ResourceRequest resourceRequest, ResourceResponse resourceResponse) {    
 try {
   // 你的业务代码
   resourceResponse.setContentType("application/json");
   PrintWriter writer = resourceResponse.getWriter();
   writer.write("{\"success\":true}");
   writer.flush();
   return false;
 }catch(Exception e){
  resourceResponse.setContentType("application/json");
  PrintWriter writer = resourceResponse.getWriter();
  writer.write("{\"success\":false, \"errorMsg\":\"业务执行出错\"}");
  writer.flush();
  return true;
 }
}

前端解析响应内容判断执行结果:

req.onload = function (event) {
    const result = JSON.parse(req.responseText);
    if (result.success) {
        console.log("success");
    } else {
        console.log("error:" + result.errorMsg);
    }
}

内容的提问来源于stack exchange,提问作者Janine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:36:03