在Lotus Notes中使用MTOM:寻求Web Service Consumer创建协助
我来帮你一步步搞定支持MTOM的Lotus Notes Web Service Consumer,顺便也梳理下你之前写Provider代码时可能踩的坑~
创建支持MTOM的Lotus Notes Web Service Consumer 步骤指导
1. 准备MTOM-enabled的Web Service WSDL
首先得确保目标Web Service(不管是你自己开发的还是第三方的)已经启用MTOM,并且有可用的WSDL文件。如果是你自己写的Provider,先把它调通(后面我会分析你代码里的问题)。
2. 生成Web Service Consumer代理
在Domino Designer里操作:
- 新建一个代理(Agent)或者Java类库(Java Library)项目
- 右键点击项目,选择Web Services → Generate Web Service Client
- 输入WSDL的URL或者本地文件路径,点击下一步
- 在配置界面,找到MTOM相关选项(一般在Advanced或Binding配置页),勾选「Enable MTOM」
- 完成生成,Domino会自动生成对应的Consumer代理类和依赖文件
3. 编写Consumer调用代码
实例化代理类并启用MTOM特性,示例代码如下:
import com.yourpackage.MtomserviceService; import com.yourpackage.MtomservicePortType; import javax.xml.ws.soap.MTOMFeature; import java.io.File; import java.nio.file.Files; public class MTOMConsumerAgent extends AgentBase { public void NotesMain() { try { // 开启MTOM特性 MTOMFeature mtomFeature = new MTOMFeature(true); // 初始化服务和端口 MtomserviceService service = new MtomserviceService(); MtomservicePortType port = service.getMtomservicePort(mtomFeature); // 读取要发送的二进制文件(示例为PDF) String filePath = getSession().getEnvironmentString("Directory", true) + "/test.pdf"; byte[] fileBytes = Files.readAllBytes(new File(filePath).toPath()); // 调用Web Service方法 Response response = port.getResponse(fileBytes); // 处理响应结果 if ("OK".equals(response.getResponseStatus())) { System.out.println("文件上传成功!"); } else { System.err.println("上传失败:" + response.getResponseErrorText()); } } catch (Exception e) { e.printStackTrace(); } } }
4. 部署与测试
- 将代理或类库部署到Domino服务器
- 运行代理,检查服务器控制台日志,同时查看Provider端的目标目录是否有文件生成
你之前Web Service Provider代码的问题分析
看了你的Provider代码,有几个明显的问题会导致它无法正常工作:
拼写错误:
response.setResponseststus里多了一个t,正确的应该是response.setResponseStatus,这个会导致编译错误或者运行时找不到方法。缺少必要的Web Service注解:除了
@MTOM,你的类还需要@WebService注解来标识这是一个Web Service Provider,修正后:
import javax.jws.WebService; import javax.xml.ws.soap.MTOM; @WebService(serviceName = "MtomserviceService", portName = "MtomservicePort") @MTOM(enabled = true) public class Mtomservice { // 你的方法代码... }
- 资源未关闭:
FileOutputStream没有手动关闭,可能导致文件损坏或资源泄漏,建议用try-with-resources语法自动管理:
try (FileOutputStream fileOut = new FileOutputStream(new File(filePath))) { fileOut.write(arg0); response.setResponseStatus("OK"); } catch (Exception e) { // 异常处理逻辑 }
- Response类缺少JAXB注解:
Response作为Web Service的返回对象,需要添加@XmlRootElement注解,并且要有无参构造函数,才能被JAXB正确序列化:
import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Response { private String responseStatus; private String responseErrorText; // 必须要有无参构造函数 public Response() {} // Getter和Setter方法 public String getResponseStatus() { return responseStatus; } public void setResponseStatus(String responseStatus) { this.responseStatus = responseStatus; } public String getResponseErrorText() { return responseErrorText; } public void setResponseErrorText(String responseErrorText) { this.responseErrorText = responseErrorText; } }
修正这些问题后,你的Provider应该能正常运行,之后再按照前面的步骤创建Consumer即可。
内容的提问来源于stack exchange,提问作者Renat Ahmetshin
相关产品推荐
相关产品推荐

