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

如何编写可接收文件的Liferay 6.2远程服务?

Liferay 6.2远程服务文件上传解决方案

问题原因

  • Liferay 6.2的Service Builder对File、InputStream这类本地IO类型不支持自动生成SOAP/JSON服务方法,因为JAX-WS/JAX-RS无法直接序列化这些类型。
  • 使用byte[]参数时,JSON Web Service(JWS)的序列化逻辑存在兼容性问题,且你使用的请求路径不符合Liferay JSON WS的规范,导致出现No JSON web service action associated错误。

正确实现方式

方式一:通过HttpServletRequest处理文件上传(推荐用于JSON请求)

直接在远程服务方法中注入HttpServletRequest,从请求中解析multipart格式的上传文件:

public class RemoteServiceRequestServiceImpl extends RemoteServiceRequestServiceBaseImpl {
    // 其他已有的方法...

    public JSONArray testFileSubmission(HttpServletRequest request) throws PortalException, IOException {
        JSONArray data = JSONFactoryUtil.createJSONArray();
        JSONObject message = JSONFactoryUtil.createJSONObject();
        
        // 转换为上传请求对象,获取文件
        UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(request);
        // 这里的"file"对应表单上传的字段名
        File uploadedFile = uploadRequest.getFile("file");
        
        if (uploadedFile != null) {
            message.put("MESSAGE", String.format("文件上传成功:%s,大小:%d字节", uploadedFile.getName(), uploadedFile.length()));
        } else {
            message.put("MESSAGE", "未检测到上传文件");
        }
        
        data.put(message);
        return data;
    }
}

调用方式:
用Postman发送POST请求,选择form-data格式,添加键为file的文件字段,请求URL为:
http://[你的Liferay域名]/api/jsonws/remoterequest/test-file-submission
(注意路径必须以/api/jsonws/开头,后续是portlet名称和方法名)

方式二:使用DataHandler实现SOAP服务文件上传

如果需要通过SOAP协议上传文件,使用JAX-WS支持的DataHandler类型作为参数:

import javax.activation.DataHandler;
import java.io.IOException;
import java.io.InputStream;

public class RemoteServiceRequestServiceImpl extends RemoteServiceRequestServiceBaseImpl {
    // 其他已有的方法...

    public JSONArray testFileSubmission(DataHandler fileData) throws IOException {
        JSONArray data = JSONFactoryUtil.createJSONArray();
        JSONObject message = JSONFactoryUtil.createJSONObject();
        
        InputStream inputStream = fileData.getInputStream();
        long fileSize = inputStream.available();
        
        message.put("MESSAGE", String.format("文件流大小:%d字节", fileSize));
        inputStream.close();
        
        data.put(message);
        return data;
    }
}

运行Service Builder后,会自动在RemoteServiceRequestServiceSoap类中生成对应的SOAP方法,可通过SoapUI等SOAP客户端,以附件形式上传文件调用。

关键注意事项

  • JSON Web Service的请求路径必须遵循/api/jsonws/[portlet-name]/[method-name]的规范,不能直接使用portlet的上下文路径。
  • 处理文件上传时,确保请求的Content-Type为multipart/form-data。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:15:30