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

Liferay 7.4中MVC Resource Command无法获取AJAX JSON数据问题

问题原因与解决方案

核心错误点

  1. AJAX请求的Content-Type设置错误:你使用了contentType: "json",但标准的JSON请求Content-Type应为application/json,这会导致后端无法正确识别请求格式。
  2. 后端参数读取方式错误:ResourceParameters和ParamUtil.getString()仅用于解析application/x-www-form-urlencoded格式的参数(如表单提交、URL拼接参数),无法读取请求体中的JSON数据。

具体修改步骤

1. 修正前端AJAX配置

修改main.js中的ajaxCall函数,调整Content-Type为标准值:

function ajaxCall(data) {
    $.ajax({
        beforeSend : function() {
            /*showSpinner();*/
        },
        url: empleadoResourceURL,
        type: "POST",
        data: JSON.stringify(data),
        // 修正Content-Type为标准JSON格式标识
        contentType: "application/json",
        success: function(data) {
            console.log("Respuesta de la solicitud: " + data);
            
            switch(data){
                case 'updateEmployee':
                    console.log('Empleado actualizado: OK');
                break;
            }   
        },
        error: function(xhr, status) {
            console.log("La solicitud ha fallado: " +  status);
        },
        complete: function(xhr, status) {
            /*hideSpinner();*/
        }
    });
}

2. 后端读取并解析JSON请求体

修改EmpleadoResource的doServeResource方法,直接读取请求体中的JSON数据并解析:

@Override
public void doServeResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws Exception {
    System.out.println("I HAVE PASSED");
    
    PrintWriter printWriter = resourceResponse.getWriter();
    
    // 读取请求体中的JSON字符串
    InputStream inputStream = resourceRequest.getPortletInputStream();
    String jsonPayload = IOUtil.toString(inputStream);
    
    // 将JSON解析为Map对象
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> requestData = objectMapper.readValue(
        jsonPayload, new TypeReference<Map<String, Object>>() {}
    );
    
    // 获取传递的参数
    String action = (String) requestData.get("action");
    String selectedEmployee = (String) requestData.get("selectedEmployee");
    
    System.out.println("ACTION: " + action);
    System.out.println("SELECTED_EMPLOYEE: " + selectedEmployee);
    
    printWriter.print(EmpleadoPortletKeys.ACTION_REMOVE_EMPLEADO);
}

3. 导入必要的依赖包

确保类中导入以下包:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liferay.portal.kernel.io.IOUtil;
import java.io.InputStream;
import java.util.Map;

补充说明

  • Liferay 7.4默认已内置Jackson相关库,无需额外引入依赖。
  • 如果需要更规范的参数处理,可以创建对应的DTO类替代Map,通过objectMapper.readValue(jsonPayload, YourDTO.class)直接解析为实体对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:22:44