Liferay 7.4中MVC Resource Command无法获取AJAX JSON数据问题
问题原因与解决方案
核心错误点
- AJAX请求的Content-Type设置错误:你使用了
contentType: "json",但标准的JSON请求Content-Type应为application/json,这会导致后端无法正确识别请求格式。 - 后端参数读取方式错误:
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
相关产品推荐
相关产品推荐

