如何编写可接收文件的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
相关产品推荐
相关产品推荐

