axis2 にデプロイされた Web サービスにファイル (DataHandler) を送信しようとすると問題が発生します。
これは私のクライアント コードです (Web サービス呼び出しに関する部分のみ):
DataHandler dh = new DataHandler(new FileDataSource("file"));
appStub serviceStub = new appStub("http://localhost:3333/axis2/services/myApp");
ServiceClient serviceClient = serviceStub._getServiceClient();
Options options = new Options();
options.setTo(new EndpointReference("http://localhost:3333/axis2/services/myApp"));
options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);
serviceClient.setOptions(options);
serviceStub._setServiceClient(serviceClient);
appStub.sendFileData req = new appStub.sendFileData ();
req.setId(clientId);
req.setLoginName(loginName);
req.setPassword(password);
req.setFile(dh);
appStub.sendFileDataResponse res = serviceStub.setUELData(req);
これは、クライアントが送信する SOAP メッセージです (TCP MON 経由で傍受)。
POST /axis2/services/myApp HTTP/1.1
Content-Type: multipart/related; boundary="MIMEBoundary_7129fcac678a04aa6ca900d73cbc34c19867765e3d9ab5e9"; type="application/xop+xml"; start="<0.4129fcac678a04aa6ca900d73cbc34c19867765e3d9ab5e9@apache.org>"; start-info="text/xml"
SOAPAction: "urn:sendFileData"
User-Agent: Axis2
Host: 127.0.0.1:3333
Transfer-Encoding: chunked
649
--MIMEBoundary_7129fcac678a04aa6ca900d73cbc34c19867765e3d9ab5e9
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <0.4129fcac678a04aa6ca900d73cbc34c19867765e3d9ab5e9@apache.org>
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns3:sendFileData xmlns:ns3="http://myApp">
<ns3:id>12</ns3:id>
<ns3:loginName>Admin</ns3:loginName>
<ns3:password>pass</ns3:password>
<ns3:file>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:1.5129fcac678a04aa6ca900d73cbc34c19867765e3d9ab5e9@apache.org" />
</ns3:file>
</ns3:sendFileData >
</soapenv:Body>
</soapenv:Envelope>--MIMEBoundary_7129fcac678a04aa6ca900d73cbc34c19867765e3d9ab5e9Content-Type: application/octet-streamContent-Transfer-Encoding: binaryContent-ID:
<1.5129fcac678a04aa6ca900d73cbc34c19867765e3d9ab5e9@apache.org>20110412080306;98.8952;NOLA DIR SUD;Marcia20110412080958;97.6259;PALMA CAMPANIA DIR SUD;Marcia20110412081306;101.7761;SARNO DIR SUD;Marcia20110412081530;97.9944;NOCERA PAGANI DIR SUD;Marcia20110412081808;89.6547;CASTEL SAN GIORGIO DIR SUD;Marcia20110412082309;89.4068;NOCERA PAGANI DIR NORD;Marcia20110412082446;103.7815;SARNO DIR NORD;Marcia20110412082829;94.6448;PALMA CAMPANIA DIR NORD;Marcia20110412083333;92.4737;ALL A30 A16 DIR NORD;Marcia20110412084337;113.5370;ALL A30 A1 DIR NORD;Marcia20110412085201;121.0054;CASERTA NORD DIR NORD;Emergenza--MIMEBoundary_7129fcac678a04aa6ca900d73cbc34c19867765e3d9ab5e9--0
これは Web サービス クラスです。
@MTOM
@WebService(serviceName = "myApp")
public class myApp{
@WebMethod(operationName = "sendFileData")
public boolean sendFileData(@WebParam(name = "id") int id, @WebParam(name = "loginName") String loginName, @WebParam(name = "password") String password, @WebParam(name = "file") @XmlMimeType("application/octet-stream") DataHandler dh) throws InternalServerException, InvalidSentDataException {
logger.info(locale.getString("WEB SERVICE REQUEST SETUELDATA"));
...
SOAP メッセージからわかるように、ファイルはクライアントによって正しく添付されています。ただし、Web サービスが SOAP メッセージを受信すると、次の例外がスローされます。
[ERROR] 4
java.lang.ArrayIndexOutOfBoundsException: 4
at org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:630)
at org.apache.axis2.rpc.receivers.RPCUtil.processRequest(RPCUtil.java:153)
at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:206)
at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:117)
at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172)
at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:617)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1760)
at java.lang.Thread.run(Thread.java:724)
クライアントから DataHandler として null を送信すると、Web サービスで例外がスローされないため、問題は DataHandler パラメーターが原因であると思います。私のコードで何が間違っていますか?!
編集: SOAP メッセージで添付ファイル (単純な csv ファイル) を確認できることに気付きましたが、webService からそれを OMElement として取得して OMElement のテキストを出力しようとすると、次のような文字列があります: