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に続きます。