SOAP(Simple Object Access Protocol) 프로토콜을 이용해야 할 경우가 생겨서 이를 서비스 하는
클라이언트와 서버를 만들어보기로 하였습니다.
들어가기 전에 짧은 생각은 이렇습니다.
이 웹서비스가 나온 이후로 XML 형식이 서비스의 교환 형식으로 인기를 얻었던 것이 그리 오래 전 이야기가 아니었으나,
요즘은 그 보다는 좀 더 간단한 JSON 이 나오면서 인기가 많이 사그라 든 느낌입니다.
하지만, 그 각광받던 시기에 이렇게 만들어진 시스템들은 여전히 어느 곳에서든 살아있다는 것입니다. 이렇게 소위 레거시 시스템이 되어버리고 나면 이런 시스템을 수정하거나 기능추가를 위해서 건드리는 것은 위험한 일이라는 것은 개발을 한 사람이라면 누구든 느끼는 일일 것입니다.
그래서, 이렇게 레거시 시스템으로 예전 웹서비스가 존재하고 그 서비스가 SOAP 서비스 일 경우를 대비해서 도체대 이 서비스를 어떻게 만드는 것인지 알아 볼 필요성은 있을 것이라고 판단 되는 군요.
아파치 axis2
이 유명한 라이브러리는 여전히 그 명맥을 유지하고 있으며, SOAP 스팩을 지원해 주는 것 중에 제일 내가 생각나는 라이브러리 입니다.
SOAP 서비스를 위해서 다양한 기능을 제공해 주는 것으로 알고 있습니다. 다만, 그냥 아는 것만 쓰는 것이고 소개 할 정도로 잘 쓰지는 못합니다.
이 서비스를 이용하기 위해서는 일반적으로 wsdl 이라는 파일이 필요합니다. 이 파일을 근거로 구현이 만들어진다고 보면 됩니다.
아스키 텍스트 파일이며, 이 파일에 정의 된 형태대로 SOAP 스텁, 프록시 코드를 생성해 주어야 하는 데요... 이를 해주는 것이 이 라이브러리의 주요 역할 중 하나라고 생각 합니다.
https://www.apache.org/dyn/closer.lua/axis/axis2/java/core/1.8.2/axis2-1.8.2-bin.zip
위의 명령처럼 따로 자바 클래스에서 만들어 주는 방법이 있으나, 아래와 같이 bin 폴더 내에 여러가지 기능을 하는 배치 파일들이 들어 있음을 확인 할 수 있습니다.
사진 설명을 입력하세요.
기본적으로 필요한 환경 변수는
- AXIS2_HOME
- JAVA_HOME
이 되겠습니다.
대충 환경 설정 파일을 만들어 보면 다음처럼 만들 수 있겠습니다.
@rem SET JAVA_HOME=D:\DEV\SDK\JDK\jdk-11.0.2
SET ANT_HOME=C:\DEV\Tools\apache-ant-1.9.4
@rem SET JAVA_HOME=D:\DEV\SDK\JDK\jdk1.8.0_152
SET JAVA_HOME=D:\DEV\SDK\JDK\jdk-17.0.2
SET AXIS2_HOME=D:\DEV\Experiments\EOCSInterface\SOAP\axis2-1.8.2
SET ANT_OPTS=-Dfile.encoding=EUC-KR
SET PATH=%JAVA_HOME%\BIN;%ANT_HOME%\bin;%AXIS2_HOME%\BIN;.;%PATH%
SET CLASSPATH=.
테스트를 위한 build 환경설정
우선 axis2 소스에서 제공하는 wsdl 중 하나인 perf.wsdl을 사용해서 웹서비스를 만들어보기로 했습니다. 전체적인 절차는 다음 절차서를 참고 하였습니다.
우선 Ant 를 사용하는 build.xml 파일은 다음처럼 구성 합니다.
<!DOCTYPE project>
<project name="wsdl2java-example" default="usage" basedir=".">
<property name="project-name" value="wsdl2java-example"/>
<property file="build.properties"/>
<property name="build" value="build"/>
<property name="src" value="src"/>
<property name="build.classes" value="build/classes" />
<path id="axis.classpath">
<pathelement location="build/classes" />
<fileset dir="${axis.home}/lib">
<include name="**/*.jar" />
</fileset>
<pathelement location="${build.classes}" />
</path>
<path id="axis_client.classpath">
<pathelement location="build/classes" />
<fileset dir="${axis.home}">
<include name="**/*.jar" />
</fileset>
<fileset dir="lib">
<include name="*.jar" />
</fileset>
<pathelement location="${build.classes}" />
</path>
<target name="usage" description="Build file usage info (default task)">
<echo message=" " />
<echo message="${project-name} " />
<echo message="-------------------------------------------------------" />
<echo message=" " />
<echo message="Available Targets:" />
<echo message=" " />
<echo message=" Compiling:" />
<echo message=" compile - Compiles the WSDL2Java source code" />
<echo message=" " />
<echo message=" Compiling client:" />
<echo message=" compile_client - Compiles the client source code" />
<echo message=" " />
<echo message=" Cleaning up:" />
<echo message=" clean - Delete class files" />
<echo message=" " />
<echo message=" WSDL:" />
<echo message=" wsdl2java - Generate source from WSDL" />
<echo message=" " />
<echo message=" AAR:" />
<echo message=" aar - Generate an .aar for deployment into WEB-INF/services" />
<echo message=" " />
<echo message=" Executing:" />
<echo message=" runLogin - Execute the runLogin client" />
</target>
<target name="prepare" >
<mkdir dir="${build.classes}" />
</target>
<target name="clean" >
<delete dir="${build}" />
<delete dir="${dist}" />
</target>
<target name="compile">
<echo message="Compiling wsdl2 files"/>
<javac
srcdir="output"
destdir="${build.classes}"
deprecation="true"
failonerror="true" debug="true">
<classpath refid="axis.classpath"/>
</javac>
</target>
<target name="wsdl2java" depends="clean,prepare">
<delete dir="output" />
<java classname="org.apache.axis2.wsdl.WSDL2Java" fork="true">
<classpath refid="axis.classpath"/>
<arg value="-d"/>
<arg value="xmlbeans"/>
<arg value="-uri"/>
<arg file="wsdl/perf.wsdl"/>
<arg value="-ss"/>
<arg value="-g"/>
<arg value="-sd"/>
<arg value="-o"/>
<arg file="output"/>
<arg value="-p"/>
<arg value="org.example.perf"/>
</java>
<!-- Move the schema folder to classpath-->
<move todir="${build.classes}">
<fileset dir="output/resources">
<include name="**/*schema*/**/*.class"/>
<include name="**/*schema*/**/*.xsb"/>
</fileset>
</move>
</target>
<target name="jar_wsdl" depends="compile">
<jar jarfile="lib/axis2_example_wsdl.jar" >
<fileset dir="${build.classes}" />
</jar>
</target>
<!-- build an .aar file for axis2 web services -->
<target name="aar" depends="compile">
<delete dir="${build.classes}/META-INF" />
<mkdir dir="${build.classes}/META-INF" />
<copy todir="${build.classes}/META-INF" >
<fileset dir="output/resources" >
<!-- axis2 web services definitions file -->
<include name="services.xml"/>
</fileset>
<fileset dir="wsdl" >
<include name="perf.wsdl"/>
</fileset>
</copy>
<jar jarfile="dist/perf.aar" >
<fileset dir="${build.classes}" />
</jar>
</target>
<target name="compile_client">
<echo message="Compiling client files"/>
<javac
srcdir="src"
destdir="${build.classes}"
deprecation="true"
failonerror="true" debug="true">
<classpath refid="axis.classpath"/>
</javac>
</target>
<target name="runLogin" depends="prepare,compile_client" description="run simple Login client">
<java classname="org.client.LoginClient" >
<classpath refid="axis_client.classpath"/>
</java>
</target>
</project>
> wsdl2java 태스크
wsdl2java 태스크를 다음과 같이 실행 합니다.
위 스크립트 태스크가 실행 되면 아래와 같이 소스 폴더가 생성 됩니다.
> jar_wsdl 태스크
그 다음으로 jar_wsdl 태스크를 다음과 같이 실행 합니다.
수많은 warning이 발생 되네요... 하지만 jar 파일이 생성 된 것을 확인 할 수 있습니다.
> aar 태스크
마지막으로 aar 태스크를 다음과 같이 실행 하여 aar 파일을 만들 수 있습니다.
테스트를 위한 톰캣 환경설정
이제는 위의 코드를 모아서 웹서비스를 만들어 볼 것입니다. WAS 서버에 올리는 것이 젤 쉬운일이 아닐까 합니다. WAS 서버는 톰캣을 이용해 보기로 합니다. 11까지 버전이 나오긴 했는 데...
왠지 맘에 끌리는 9를 사용 해보기 하겠습니다.
우선 톰캣을 다운로드 받아 봅니다.
https://tomcat.apache.org/download-90.cgi
그런 다음 axis2 배치 폴더 밑에 webapp 로 가서 다음 명령을 입력 합니다.
ant create.war
위 명령으로 다음 디렉토리에 axis2.war 파일이 생성 됩니다.
해당 파일을 톰캣의 webapps 디렉토리에 놓고, 톰캣을 실행 합니다.
그런 다음 다음 URL 로 접근해 봅니다.
https://localhost:8080/axis2/
톰캣 9의 경우 다음 오류가 발생 하였습니다.
음... 아무래도 보안 오류가 발생 하는 것 같습니다. 따라서 다음과 같이 URL을 주도록 하겠습니다.
http://localhost:8080/axis2/
다음과 같은 화면이 나오면 제대로 구동 하는 것입니다.
테스트를 위한 톰캣 서비스 만들기
위에서 만들어진 aar 파일과 jar 파일을 각각 넣어 주어야 함니다.
- aar -> services
- jar -> lib
위와 같이 구성하고 다시 톰캣을 구동 해 봅시다. 아래와 같이 서비스가 하나 생성 된 것을 확인 할 수 있습니다.
http://localhost:8080/axis2/services/listServices
wsdl을 다음과 같이 확인 해 봅시다.
http://localhost:8080/axis2/services/PerfSoapService?wsdl
클라이언트트 코드를 위한 환경설정
클라이언트 코드를 만들기 위해서 다시 build.xml 파일로 돌아가 보면 다음 태스크를 볼 수가 있습니다. src 라는 폴더에 클라이언트 코드가 필요 합니다(스텁).
src 라는 폴더도 존재하지 않으므로 src 폴더를 만들어 놓고 클라이언트 코드를 만들 준비를 해야만 합니다.
<target name="compile_client">
<echo message="Compiling client files"/>
<javac
srcdir="src"
destdir="${build.classes}"
deprecation="true"
failonerror="true" debug="true">
<classpath refid="axis.classpath"/>
</javac>
</target>
Stub과 Skelecton 코드를 위한 환경설정
클라이언트에서 사용 되는 코드를 일반적으로 Stub 이라고 하고, 서버에서 사용 되는 코드를 Skeleton 이라고 합니다. 이 코드를 만들기 위해서 이제 비즈니스 로직을 넣어 줘야 합니다.
우선 서버코드를 먼저 만들고, 클라이언트 코드를 만들 도록 하겠습니다.
그냥 커맨드라인으로 만들기에는 골치 아프니, 이클립스를 사용해 보도록 하겠습니다.
다음 정도의 느낌이 나도록 구성하면 될 듯 합니다.
위의 코드는 이미 우리가 코드 생성기를 통해서 얻은 코드이며, 자바 프로젝트를 하나 생성해서 output 폴더에 만들어 놓은 src 폴더를 복사한 것에 불과 합니다.
신경써서 볼 부분은 module-info.java 파일이며, 다음과 같이 구성하면 될 것입니다.
/**
*
*/
/**
* @author User
*
*/
module SoapCodeGener {
requires axis2.kernel;
requires axiom.api;
requires java.rmi;
requires java.xml;
requires xmlbeans;
requires axis2.xmlbeans;
}
Skeleton 코드 만들기
우리의 PerfSoapService 는 다음과 같은 services.xml 파일의 내용을 가지고 있습니다.
아래 내용을 보면, PerfSoapServiceSkeleton 이라는 클래스와 거기에 들어가는 문자열인 것입니다.
<?xml version="1.0" encoding="UTF-8"?><!-- This file was auto-generated from WSDL --><!-- by the Apache Axis2 version: 1.8.2 Built on : Jul 13, 2022 (06:38:03 EDT) --><serviceGroup>
<service name="PerfSoapService">
<messageReceivers>
<messageReceiver mep="http://www.w3.org/ns/wsdl/in-out" class="org.example.perf.PerfSoapServiceMessageReceiverInOut"/>
</messageReceivers>
<parameter name="ServiceClass">org.example.perf.PerfSoapServiceSkeleton</parameter>
<parameter name="useOriginalwsdl">true</parameter>
<parameter name="modifyUserWSDLPortAddress">true</parameter>
<operation name="handleStringArray" mep="http://www.w3.org/ns/wsdl/in-out" namespace="http://perf.samples">
<actionMapping>handleStringArray</actionMapping>
<outputActionMapping>http://perf.samples/PerfPortType/handleStringArrayResponse</outputActionMapping>
</operation>
</service>
</serviceGroup>
PerfSoapServiceSkeleton 자바 파일을 확인 해 봅시다.
/**
* PerfSoapServiceSkeleton.java
*
* <p>This file was auto-generated from WSDL by the Apache Axis2 version: 1.8.2 Built on : Jul 13,
* 2022 (06:38:03 EDT)
*/
package org.example.perf;
/** PerfSoapServiceSkeleton java skeleton for the axisService */
public class PerfSoapServiceSkeleton {
/**
* Auto generated method signature
*
* @param inputElement
* @return outputElement
*/
public samples.perf.OutputElementDocument handleStringArray(
samples.perf.InputElementDocument inputElement) {
// TODO : fill this with the necessary business logic
throw new java.lang.UnsupportedOperationException(
"Please implement " + this.getClass().getName() + "#handleStringArray");
}
}
위의 코드를 다음과 같이 바꾸어 보면 좋을 듯 합니다.
/**
* PerfSoapServiceSkeleton.java
*
* <p>This file was auto-generated from WSDL by the Apache Axis2 version: 1.8.2 Built on : Jul 13,
* 2022 (06:38:03 EDT)
*/
package org.example.perf;
import samples.perf.OutputElementDocument;
/** PerfSoapServiceSkeleton java skeleton for the axisService */
public class PerfSoapServiceSkeleton {
/**
* Auto generated method signature
*
* @param inputElement
* @return outputElement
*/
public samples.perf.OutputElementDocument handleStringArray(
samples.perf.InputElementDocument inputElement) {
// TODO : fill this with the necessary business logic
//throw new java.lang.UnsupportedOperationException(
// "Please implement " + this.getClass().getName() + "#handleStringArray");
String oElementStr = "This is from server";
OutputElementDocument oElement = OutputElementDocument.Factory.newInstance();
oElement.setOutputElement(oElementStr);
return oElement;
}
}
별 이상이 없으면 다시 이를 위해서 서비스 빌드를 하고, 클라이언트를 사용하여야 할 것 입니다.
위의 소스 코드를 다시 집어 넣고 다음 명령으로 빌드 합니다.
ant jar_wsdl
ant aar
그런 다음, 톰캣 디렉토리에 넣어 주도록 하겠습니다. 배치파일로 만든다면 다음과 같은 스크립트를 만들 수가 있을 것입니다.
SET TOMCAT_HOME=C:\DEV\Experimental\SoapWS\apache-tomcat-9.0.85
SET TOBEE_HOME=C:\DEV\Experimental\SoapWS\TobeeSoapWS
xcopy %TOBEE_HOME%\dist\perf.aar %TOMCAT_HOME%\webapps\axis2\WEB-INF\services /Y
xcopy %TOBEE_HOME%\lib\axis2_example_wsdl.jar %TOMCAT_HOME%\webapps\axis2\WEB-INF\lib /Y
Stub 코드 만들기
이제 서버 코드를 만들었으니, 우리의 PerfSoapService에 대한 클라이언트 코드를 만들기 위해서는 다음의 클래스를 사용 해서 코드를 만들어야만 합니다.
- PerfSoapServiceStub
/**
* PerfSoapServiceStub.java
*
* <p>This file was auto-generated from WSDL by the Apache Axis2 version: 1.8.2 Built on : Jul 13,
* 2022 (06:38:03 EDT)
*/
package org.example.perf;
/*
* PerfSoapServiceStub java implementation
*/
public class PerfSoapServiceStub extends org.apache.axis2.client.Stub {
protected org.apache.axis2.description.AxisOperation[] _operations;
// hashmaps to keep the fault mapping
private java.util.Map<org.apache.axis2.client.FaultMapKey, java.lang.String>
faultExceptionNameMap =
new java.util.HashMap<org.apache.axis2.client.FaultMapKey, java.lang.String>();
private java.util.Map<org.apache.axis2.client.FaultMapKey, java.lang.String>
faultExceptionClassNameMap =
new java.util.HashMap<org.apache.axis2.client.FaultMapKey, java.lang.String>();
private java.util.Map<org.apache.axis2.client.FaultMapKey, java.lang.String> faultMessageMap =
new java.util.HashMap<org.apache.axis2.client.FaultMapKey, java.lang.String>();
...
위 코드를 사용하는 클래스를 다음과 같이 만들어 봅시다.
package org.example.perf.cli;
import org.apache.axis2.AxisFault;
import org.example.perf.PerfSoapServiceStub;
import samples.perf.InputElementDocument.InputElement;
public class PerfSoapServiceClient {
public static void main(String[] args) {
System.out.println("PerfSoapServiceClient, firing...");
samples.perf.OutputElementDocument oElementDocu = null;
try {
samples.perf.InputElementDocument inputElement12 = samples.perf.InputElementDocument.Factory.newInstance();
InputElement iElement = InputElement.Factory.newInstance();
iElement.addItem("my item1");
iElement.addItem("my item2");
iElement.addItem("my item3");
inputElement12.setInputElement(iElement);
PerfSoapServiceStub stub = new PerfSoapServiceStub();
oElementDocu = stub.handleStringArray(inputElement12);
System.out.println("PerfSoapServiceClient, from server..."
+ oElementDocu.getOutputElement());
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
다음처럼 ant 태스크를 사용하도록 하겠습니다.
ant compile_client
JDK 18 부터는 위의 코드는 다음 오류를 발생 시킵니다.
java.lang.UnsupportedOperationException: The Security Manager is deprecated and will be removed in a future release
at java.base/java.lang.System.setSecurityManager(System.java:416)
따라서 JDK 17을 사용해야 할 것입니다. 위 오류는 아마도 jar 파일을 서명해야 하지 않을까 하는 생각인데... 정신 건강에 나쁠 듯하네요...
서비스 확인하기
이제 서비스를 확인 해 볼 차례입니다. 여태까지 만들어 본 서비스를 다음 순서대로 진행 해 보도록 하겠습니다.
톰캣을 실행하고,
서비스 확인하고,
클라이언트 실행합니다.
ant compile_client
ant tobee_ws_cli
뭐가 좀 안맞아서 다음과 같은 오류가 발생 하게 되었습니다. wsdl 선언과 서비스가 맞질 않은 듯 해서 다음과 같이 소스를 바꿔 줍니다.
package org.example.perf.cli;
import org.apache.axis2.AxisFault;
import org.example.perf.PerfSoapServiceStub;
import samples.perf.InputElementDocument.InputElement;
public class PerfSoapServiceClient {
public static void main(String[] args) {
System.out.println("PerfSoapServiceClient, firing...");
samples.perf.OutputElementDocument oElementDocu = null;
java.lang.String targetEndpoint = "http://localhost:8080/axis2/services/PerfSoapService";
try {
// SecurityManager sm = new SecurityManager();
// System.setSecurityManager(sm);
// AccessControlContext accessCon = AccessController.getContext();
samples.perf.InputElementDocument inputElement12 = samples.perf.InputElementDocument.Factory.newInstance();
InputElement iElement = InputElement.Factory.newInstance();
iElement.addItem("my item1");
iElement.addItem("my item2");
iElement.addItem("my item3");
inputElement12.setInputElement(iElement);
//PerfSoapServiceStub(java.lang.String targetEndpoint)
PerfSoapServiceStub stub = new PerfSoapServiceStub(targetEndpoint);
oElementDocu = stub.handleStringArray(inputElement12);
System.out.println("PerfSoapServiceClient, from server..."
+ oElementDocu.getOutputElement());
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
그리고 다시,
ant compile_client
ant tobee_ws_cli
다시 해 봅니다..........
LoginEndpoint
build.xml
<!DOCTYPE project>
<project name="wsdl2java-example" default="usage" basedir=".">
<property name="project-name" value="wsdl2java-example"/>
<property file="build.properties"/>
<property name="build" value="build"/>
<property name="src" value="src"/>
<property name="build.classes" value="build/classes" />
<path id="axis.classpath">
<pathelement location="build/classes" />
<fileset dir="${axis.home}/lib">
<include name="**/*.jar" />
</fileset>
<pathelement location="${build.classes}" />
</path>
<path id="axis_client.classpath">
<pathelement location="build/classes" />
<fileset dir="${axis.home}">
<include name="**/*.jar" />
</fileset>
<fileset dir="lib">
<include name="*.jar" />
</fileset>
<pathelement location="${build.classes}" />
</path>
<target name="usage" description="Build file usage info (default task)">
<echo message=" " />
<echo message="${project-name} " />
<echo message="-------------------------------------------------------" />
<echo message=" " />
<echo message="Available Targets:" />
<echo message=" " />
<echo message=" Compiling:" />
<echo message=" compile - Compiles the WSDL2Java source code" />
<echo message=" " />
<echo message=" Compiling client:" />
<echo message=" compile_client - Compiles the client source code" />
<echo message=" " />
<echo message=" Cleaning up:" />
<echo message=" clean - Delete class files" />
<echo message=" " />
<echo message=" WSDL:" />
<echo message=" wsdl2java - Generate source from WSDL" />
<echo message=" " />
<echo message=" AAR:" />
<echo message=" aar - Generate an .aar for deployment into WEB-INF/services" />
<echo message=" " />
<echo message=" Executing:" />
<echo message=" runLogin - Execute the runLogin client" />
</target>
<target name="prepare" >
<mkdir dir="${build.classes}" />
</target>
<target name="clean" >
<delete dir="${build}" />
<delete dir="${dist}" />
</target>
<target name="compile">
<echo message="Compiling wsdl2 files"/>
<javac
srcdir="output"
destdir="${build.classes}"
deprecation="true"
failonerror="true" debug="true">
<classpath refid="axis.classpath"/>
</javac>
</target>
<target name="wsdl2java" depends="clean,prepare">
<delete dir="output" />
<java classname="org.apache.axis2.wsdl.WSDL2Java" fork="true">
<classpath refid="axis.classpath"/>
<arg value="-d"/>
<arg value="xmlbeans"/>
<arg value="-uri"/>
<arg file="wsdl/LoginEndpoint.wsdl"/>
<arg value="-ss"/>
<arg value="-g"/>
<arg value="-sd"/>
<arg value="-o"/>
<arg file="output"/>
<arg value="-p"/>
<arg value="org.example.types"/>
</java>
<!-- Move the schema folder to classpath-->
<move todir="${build.classes}">
<fileset dir="output/resources">
<include name="**/*schema*/**/*.class"/>
<include name="**/*schema*/**/*.xsb"/>
</fileset>
</move>
</target>
<target name="jar_wsdl" depends="compile">
<jar jarfile="lib/axis2_example_wsdl.jar" >
<fileset dir="${build.classes}" />
</jar>
</target>
<!-- build an .aar file for axis2 web services -->
<target name="aar" depends="compile">
<delete dir="${build.classes}/META-INF" />
<mkdir dir="${build.classes}/META-INF" />
<copy todir="${build.classes}/META-INF" >
<fileset dir="output/resources" >
<!-- axis2 web services definitions file -->
<include name="services.xml"/>
</fileset>
<fileset dir="wsdl" >
<include name="LoginEndpoint.wsdl"/>
</fileset>
</copy>
<jar jarfile="dist/LoginEndpoint.aar" >
<fileset dir="${build.classes}" />
</jar>
</target>
<target name="compile_client">
<echo message="Compiling client files"/>
<javac
srcdir="src"
destdir="${build.classes}"
deprecation="true"
failonerror="true" debug="true">
<classpath refid="axis.classpath"/>
</javac>
</target>
<target name="runLogin" depends="prepare,compile_client" description="run simple Login client">
<java classname="org.client.LoginClient" >
<classpath refid="axis_client.classpath"/>
</java>
</target>
</project>
LoginEndpoint.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<definitions
name="LoginService"
targetNamespace="http://login"
xmlns:tns="http://login"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:ns2="http://login/types">
<types>
<schema targetNamespace="http://login/types" xmlns:tns="http://login/types"
xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<element name="returnWebLoginElement">
<complexType>
<sequence>
<element ref="tns:soap_session_idElement"/>
<element ref="tns:web_user_nameElement"/>
</sequence>
</complexType>
</element>
<element name="webLoginElement">
<complexType>
<sequence>
<element ref="tns:user_nameElement"/>
<element ref="tns:user_passwordElement"/>
</sequence>
</complexType>
</element>
<element name="user_nameElement" type="xsd:string"/>
<element name="user_passwordElement" type="xsd:string"/>
<element name="soap_session_idElement" type="xsd:string"/>
<element name="web_user_nameElement" type="xsd:string"/>
</schema>
</types>
<message name="LoginEndpoint_webLogin">
<part name="parameters" element="ns2:webLoginElement"/>
</message>
<message name="LoginEndpoint_webLoginResponse">
<part name="result" element="ns2:returnWebLoginElement"/>
</message>
<portType name="LoginEndpoint">
<operation name="webLogin">
<input message="tns:LoginEndpoint_webLogin" name="LoginEndpoint_webLogin"/>
<output message="tns:LoginEndpoint_webLoginResponse" name="LoginEndpoint_webLoginResponse"/>
</operation>
</portType>
<binding name="LoginEndpointBinding" type="tns:LoginEndpoint">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="webLogin">
<soap:operation soapAction="webLogin"/>
<input name="LoginEndpoint_webLogin">
<soap:body use="literal"/>
</input>
<output name="LoginEndpoint_webLoginResponse">
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="LoginService">
<port name="LoginEndpointPort" binding="tns:LoginEndpointBinding">
<soap:address location="http://localhost:8080/axis2/services/LoginService"/></port>
</service>
</definitions>
LoginServiceSkeleton.java
/**
* LoginServiceSkeleton.java
*
* This file was auto-generated from WSDL
* by the Apache Axis2 version: 1.0-RC4 Apr 28, 2006 (05:23:23 IST)
*/
package org.example.types;
import login.types.ReturnWebLoginElementDocument;
import login.types.ReturnWebLoginElementDocument.*;
import login.types.WebLoginElementDocument;
import login.types.WebLoginElementDocument.*;
/**
* Auto generated java skeleton for the service by the Axis code generator
*/
public class LoginServiceSkeleton {
/**
* Auto generated method signature
*
* @param webLoginElementDocument changed from param0
*
*/
public ReturnWebLoginElementDocument webLogin(WebLoginElementDocument webLoginElementDocument) {
// Todo fill this with the necessary business logic
System.out.println("LoginServiceSkeleton.webLogin reached successfully!");
// Get parameters passed in
WebLoginElement webLoginElement = webLoginElementDocument.getWebLoginElement();
String userName = webLoginElement.getUserNameElement();
String password = webLoginElement.getUserPasswordElement();
System.out.println("LoginServiceSkeleton.webLogin userName: " + userName);
System.out.println("LoginServiceSkeleton.webLogin password: " + password);
// input paramaters would be used here
// prepare output
ReturnWebLoginElementDocument retDoc = ReturnWebLoginElementDocument.Factory.newInstance();
ReturnWebLoginElement retElement = ReturnWebLoginElement.Factory.newInstance();
retElement.setWebUserNameElement("joe sixpack");
retElement.setSoapSessionIdElement("some_random_string");
System.out.println("validate retElement: " + retElement.validate());
retDoc.setReturnWebLoginElement(retElement);
System.out.println("validate retDoc: " + retDoc.validate());
System.out.println("LoginServiceSkeleton.webLogin returning...");
return retDoc;
}
}
LoginClient.java
package org.client;
import org.apache.axis2.AxisFault;
import login.types.ReturnWebLoginElementDocument;
import login.types.ReturnWebLoginElementDocument.*;
import login.types.WebLoginElementDocument;
import login.types.WebLoginElementDocument.*;
import org.example.types.LoginServiceStub;
/**
* Login.
*
*/
public class LoginClient {
public static void main(String[] args) {
try {
System.out.println("webLogin, firing...");
LoginServiceStub stub = new LoginServiceStub();
WebLoginElementDocument webLoginElementDocument = WebLoginElementDocument.Factory.newInstance();
WebLoginElement webLoginElement = WebLoginElement.Factory.newInstance();
webLoginElement.setUserNameElement("joe");
webLoginElement.setUserPasswordElement("sixpack");
webLoginElementDocument.setWebLoginElement(webLoginElement);
System.out.println("validate: " + webLoginElement.validate());
stub.webLogin(webLoginElementDocument);
ReturnWebLoginElementDocument returnWebLoginElementDocument = stub.webLogin(webLoginElementDocument);
System.out.println("Client returned");
ReturnWebLoginElementDocument.ReturnWebLoginElement retElement = returnWebLoginElementDocument
.getReturnWebLoginElement();
System.out.println("WebUserName: " + retElement.getWebUserNameElement());
System.out.println("SOAPSessionId: " + retElement.getSoapSessionIdElement());
System.out.println("webLogin, completed!!!");
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
순서를 살펴 봅니다.
axis2 서비스 만들기
cd %AXIS2_HOME%\webapp
rd /s/q ..\dist
ant create.war
톰캣 디렉토리 정리 및 복사
rd /s/q %TOMCAT_HOME%\webapps
mkdir %TOMCAT_HOME%\webapps
xcopy %AXIS2_HOME%\dist\axis2.war %TOMCAT_HOME%\webapps\ /Y
서비스 소스 만들기
cd %TOBEE_HOME%
ant wsdl2java
>>change skeleton code if possible...
ant jar_wsdl
ant aar
톰캣 시작 후,
cd %TOMCAT_HOME%\bin
chcp 65001
catalina.bat run
톰캣을 종료 한 후, axis2.war 파일 삭제
del %TOMCAT_HOME%\webapps\axis2.war
chcp 65001
catalina.bat run
서비스 소스 톰캣 복사
xcopy %TOBEE_HOME%\lib\axis2_example_wsdl.jar %TOMCAT_HOME%\webapps\axis2\WEB-INF\lib /Y
xcopy %TOBEE_HOME%\dist\LoginEndpoint.aar %TOMCAT_HOME%\webapps\axis2\WEB-INF\services /Y
톰캣 실행
클라이언트 소스 빌드 및 실행
ant compile_client
ant runLogin
부록
사용 된 배치파일
SET WS_HOME=C:\DEV\Experimental\SoapWS
SET TOBEE_HOME=%WS_HOME%\TobeeSoapWS
SET TOMCAT_HOME=C:\DEV\Experimental\SoapWS\apache-tomcat-9.0.85
@REM C:\DEV\Experimental\SoapWS
@rem SET JAVA_HOME=D:\DEV\SDK\JDK\jdk-11.0.2
SET ANT_HOME=C:\DEV\Tools\apache-ant-1.9.16
@rem SET JAVA_HOME=D:\DEV\SDK\JDK\jdk1.8.0_152
@rem SET JAVA_HOME=C:\DEV\SDK\JDK\jdk-19.0.1
SET JAVA_HOME=%WS_HOME%\jdk-17
@rem SET JAVA_HOME=%WS_HOME%\jdk-11.0.2
SET AXIS2_HOME=%WS_HOME%\axis2-1.8.2
SET ANT_OPTS=-Dfile.encoding=EUC-KR
SET PATH=%JAVA_HOME%\BIN;%ANT_HOME%\bin;%AXIS2_HOME%\BIN;.;%PATH%
SET CLASSPATH=.
module-info.java
/**
*
*/
/**
* @author User
*
*/
module SoapCodeGener {
requires axis2.kernel;
requires axiom.api;
requires java.rmi;
requires java.xml;
requires xmlbeans;
requires axis2.xmlbeans;
}
이름이 -codegen-.jar 파일의 경우와 xpp 는 제거 한다.
http://localhost:8080/axis2
admin 암호
admin:axis2
이상.
'프로그래밍' 카테고리의 다른 글
Spring MVC 내 HandlerInterceptors vs. Filters (0) | 2024.02.16 |
---|---|
Maven과 AspectJ - 완벽 환경설정 관련 (0) | 2024.02.15 |
C# app.config ? web.config? 두 파일의 호환성 (0) | 2024.02.08 |
Getter, Setter와 리플렉션 (0) | 2024.02.02 |
윈도우 용 Gnuplot 빌드해보기 (0) | 2024.02.01 |