apache CXF+Springで簡単Webサービス(MTOM編)

apache CXF+SpringでWebサービス作成時にWSDLを分離しない方法 - ITエンジニアとして生きるで紹介したもののMTOM編。

JAX-WSで簡単Webサービスクライアント(MTOM編) - ITエンジニアとして生きると同じで、実はこれもJAXBのバグで@XmlMimeType("application/octet-stream")が効かない - ITエンジニアとして生きるの中で書いてたんだけど、トレーサビリティが悪いので切り出すことにした。


それでは本題に。

◆サービスクラス

package org.ws.sample.stub.service.impl;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.activation.DataHandler;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;
import javax.xml.bind.annotation.XmlMimeType;
import javax.xml.ws.BindingType;

import org.apache.commons.io.IOUtils;
import org.sample.soa.stub.service.MTOMStubService;

@WebService(serviceName = "MTOMStubService", portName = "MTOMStubServicePort", targetNamespace = "http://impl.mtom.service.stub/")
@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL, parameterStyle = ParameterStyle.BARE)
@BindingType(value = javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_MTOM_BINDING)
public class MTOMStubServiceImpl implements MTOMStubService {

	public void attach(
			@XmlMimeType("application/octet-stream") DataHandler value,
			String fileName) {
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(new File("C:/tmp/" + fileName));
			value.writeTo(fos);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fos != null) {
				IOUtils.closeQuietly(fos);
			}
		}
	}
}

基本的には
apache CXF+SpringでWebサービス作成時にWSDLを分離しない方法 - ITエンジニアとして生きる
と同じ。変更点はバインディングタイプにMTOMを指定すること。

バインディングタイプにMTOMを指定する

@BindingType(value = javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_MTOM_BINDING)

なお今回のサービスクラスは「C:/tmp/」配下に、指定されたファイル名で添付ファイルを保存するサービスとしている。
「@XmlMimeType("application/octet-stream") 」についてはJAXBのバグで@XmlMimeType("application/octet-stream")が効かない - ITエンジニアとして生きるを参照。