Webサービス(SOAP編)その1

Webサービス(SOAP)の作成

Webサービス(SOAP編)その1では、プロバイダ(サーバ)側のサービスを作成します。

【前提条件】

  • JDK 1.8 インストール済みであること (jaxwsを使用します)

1. プログラム作成

任意のディレクトリを決め、以下のプログラムを作成します。

どこでも良いですが、サンプルでは

C:\pleiades\workspace\jaxwsApp\src

にて、作業しています。

コード記述用にEclipseを使用したい場合は、以下のイメージとなります。

※Eclipseの利用は必須ではありません。今回、ソース記述以外はコマンドプロンプトで行います。

1.1. リクエストインターフェース用のクラス作成

C:\pleiades\workspace\jaxwsApp\src\example\jaxws\CalcReq.java

package example.jaxws;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class CalcReq {
	private String param1;
	private String param2;

	public String getParam1() {
		return param1;
	}

	public void setParam1(String param1) {
		this.param1 = param1;
	}

	public String getParam2() {
		return param2;
	}

	public void setParam2(String param2) {
		this.param2 = param2;
	}
}

C:\pleiades\workspace\jaxwsApp\src\example\jaxws\ReqIF.java

package example.jaxws;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "request")
@XmlType(propOrder = { "calcReq", "precision" })

public class ReqIF {
	private CalcReq calcReq;
	int precision;

	public ReqIF() {
		this.calcReq = new CalcReq();
	}

	public CalcReq getCalcReq() {
		return calcReq;
	}

	@XmlElement
	public void setCalcReq(CalcReq calcReq) {
		this.calcReq.setParam1(calcReq.getParam1());
		this.calcReq.setParam2(calcReq.getParam2());
	}

	public int getPrecision() {
		return precision;
	}

	@XmlElement
	public void setPrecision(int precision) {
		this.precision = precision;
	}
}

1.2. レスポンスインターフェース用のクラス作成

C:\pleiades\workspace\jaxwsApp\src\example\jaxws\CalcRes.java

package example.jaxws;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class CalcRes {
	private String answer;
	private int remainder;

	public String getAnswer() {
		return answer;
	}

	public void setAnswer(String answer) {
		this.answer = answer;
	}

	public int getRemainder() {
		return remainder;
	}

	public void setRemainder(int remainder) {
		this.remainder = remainder;
	}
}

C:\pleiades\workspace\jaxwsApp\src\example\jaxws\ResIF.java

package example.jaxws;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

// use JAXB
@XmlRootElement(name = "result")
@XmlType(propOrder = { "returnCd", "calcRes" })
public class ResIF {
	private int returnCd;
	private CalcRes calcRes;

	public ResIF() {
		this.calcRes = new CalcRes();
	}

	@XmlElement
	public int getReturnCd() {
		return returnCd;
	}

	public void setReturnCd(int returnCd) {
		this.returnCd = returnCd;
	}

	@XmlElement
	public CalcRes getCalcRes() {
		return calcRes;
	}

	public void setCalcRes(CalcRes calcRes) {
		this.calcRes.setAnswer(calcRes.getAnswer());
		this.calcRes.setRemainder(calcRes.getRemainder());
	}

}

1.3. メイン処理クラスの作成

C:\pleiades\workspace\jaxwsApp\src\example\jaxws\Calculator.java

package example.jaxws;

import java.math.BigDecimal;
import java.math.RoundingMode;

import javax.jws.WebService;

@WebService
public class Calculator {

	/* 加算 */
	public ResIF add(ReqIF req) {
		ResIF res = new ResIF();
		res.setReturnCd(0);
		CalcRes calc = new CalcRes();
		calc.setAnswer("0");
		calc.setRemainder(0);
		res.setCalcRes(calc);
		try {
			float param1 = Float.valueOf(req.getCalcReq().getParam1());
			float param2 = Float.valueOf(req.getCalcReq().getParam2());
			float ans = param1 + param2;
			BigDecimal bd = new BigDecimal(ans);
			calc.setAnswer(String.valueOf(bd.setScale(req.getPrecision(), RoundingMode.HALF_UP)));
			res.setCalcRes(calc);
		} catch (Exception e) {
			res.setReturnCd(1);
		}
		return res;
	}

	/* 減算 */
	public ResIF sub(ReqIF req) {
		ResIF res = new ResIF();
		CalcRes calc = new CalcRes();
		calc.setAnswer("0");
		calc.setRemainder(0);
		res.setCalcRes(calc);
		try {
			float param1 = Float.valueOf(req.getCalcReq().getParam1());
			float param2 = Float.valueOf(req.getCalcReq().getParam2());
			float ans = param1 - param2;
			BigDecimal bd = new BigDecimal(ans);
			calc.setAnswer(String.valueOf(bd.setScale(req.getPrecision(), RoundingMode.HALF_UP)));
			res.setCalcRes(calc);
		} catch (Exception e) {
			res.setReturnCd(1);
		}
		return res;
	}

	/* 乗算 */
	public ResIF mul(ReqIF req) {
		ResIF res = new ResIF();
		CalcRes calc = new CalcRes();
		calc.setAnswer("0");
		calc.setRemainder(0);
		res.setCalcRes(calc);
		try {
			float param1 = Float.valueOf(req.getCalcReq().getParam1());
			float param2 = Float.valueOf(req.getCalcReq().getParam2());
			float ans = param1 * param2;
			BigDecimal bd = new BigDecimal(ans);
			calc.setAnswer(String.valueOf(bd.setScale(req.getPrecision(), RoundingMode.HALF_UP)));
			res.setCalcRes(calc);
		} catch (Exception e) {
			res.setReturnCd(1);
		}
		return res;
	}

	/* 除算 */
	public ResIF div(ReqIF req) {
		ResIF res = new ResIF();
		CalcRes calc = new CalcRes();
		calc.setAnswer("0");
		calc.setRemainder(0);
		res.setCalcRes(calc);
		try {
			if (req.getPrecision() == 0) {
				// 答え
				int p1 = Integer.valueOf(req.getCalcReq().getParam1());
				int p2 = Integer.valueOf(req.getCalcReq().getParam2());
				int ansi = p1 / p2;
				calc.setAnswer(String.valueOf(ansi));
				// 余り
				int rem = p1 % p2;
				calc.setRemainder(rem);
				res.setCalcRes(calc);

			} else {
				// 答え
				float param1 = Float.valueOf(req.getCalcReq().getParam1());
				float param2 = Float.valueOf(req.getCalcReq().getParam2());
				float ans = param1 / param2;
				// 指定桁数で四捨五入
				BigDecimal bd = new BigDecimal(ans);
				calc.setAnswer(String.valueOf(bd.setScale(req.getPrecision(), RoundingMode.HALF_UP)));
				res.setCalcRes(calc);
			}
		} catch (Exception e) {
			res.setReturnCd(1);
		}
		return res;
	}

}

1.4. サービス公開用クラスの作成

package example.jaxws;

import javax.xml.ws.Endpoint;

public class Server {
	public static void main(String[] args) {
		Endpoint.publish("http://localhost:8080/Calculator", new Calculator());
	}
}

2. プログラムのコンパイル

コマンドプロンプトを開き、作成したプログラムをコンパイルします。

C:\pleiades\workspace\jaxwsApp\src>javac example\jaxws\CalcReq.java
C:\pleiades\workspace\jaxwsApp\src>javac example\jaxws\ReqIF.java
C:\pleiades\workspace\jaxwsApp\src>javac example\jaxws\CalcRes.java
C:\pleiades\workspace\jaxwsApp\src>javac example\jaxws\ResIF.java
C:\pleiades\workspace\jaxwsApp\src>javac example\jaxws\Calculator.java
C:\pleiades\workspace\jaxwsApp\src>javac example\jaxws\Server.java

Webサービスに必要なファイルを生成します。

C:\pleiades\workspace\jaxwsApp\src>wsgen -cp . example.jaxws.Calculator

3. サービスの公開

3.1. Webサービスの公開

javaを実行し、webサービスを公開します。

C:\pleiades\workspace\jaxwsApp\src>java example.jaxws.Server

3.2. WSDLの確認

ブラウザに以下のURLを入力し、WSDLを確認します。

http://localhost:8080/Calculator?wsdl

Webサービス(SOAP編)その2に続きます。

タイトルとURLをコピーしました