올해 초부터 웹서비스 쪽으로 공부를 했었는데, 항상 할 때마다 끝을 못 맺고 덮어두곤 하였습니다.
눈에 들어오지 않았습니다.
그렇게 시간이 흘러... 이클립스 RCP 로 개발한 어플리케이션과 WAS 와 연동을 해야 하는데 웹서비스를
쓰면 적당할 것 같아서 다시 자료들을 모아서 시작을 했는데 운이 좋게도 성공을 한 것 같습니다.
접기
JAX-WS 의 Tool 을 사용하기 위해서는 metro 를 다운받아야 합니다.
https://metro.dev.java.net/1.3/ 에 접속하여 다운을 받습니다.
다운받은 metro-1_3.jar 파일을 설치할 경로에 옮겨놓고 더블클릭으로 실행을 시킵니다.
알집을 설치한 경우에는 바로 실행이 안되니 콘솔을 띄우고 java -jar metro-1_3.jar 명령으로 실행시킵니다.
스크롤을 맨 아래로 내린 후 Accept 버튼을 클릭
아래와 같이 설치가 완료되었습니다.
환경 변수에 JAVA_HOME 과 METRO_HOME 을 설정합니다.
이클립스의 경우 환경변수를 추가했을 때는 이클립스를 재시작해야지 Ant 에서 인식을 합니다.
기존 로직이 있는 프로젝트에 SEI 를 만듭니다.
com.idstrust.wiseone.engine.gw.webservice.workflowform.WorkflowFormWebService.java
01
@WebService
(serviceName=
"WorkflowFormWebService"
)
02
public
class
WorkflowFormWebService
extends
SpringBeanAutowiringSupport {
05
private
IWorkflowFormService service;
07
public
void
setService(IWorkflowFormService service) {
08
this
.service = service;
12
public
List<FormCategory> getRootFormCategories() {
13
System.out.println(
"invoke getRootFormCategories()"
);
14
return
service.getRootFormCategories(
99999
);
18
public
List<FormData> getCategoryFormDatas(
int
categoryIndex) {
19
System.out.println(
"invoke getCategoryFormDatas() "
+ categoryIndex);
20
return
service.getCategoryFormDatas(categoryIndex);
Ant 를 통해서 서버/클라이언트 소스를 배포하기 위해 build.xml 을 생성합니다.
아래 build.xml 의 deploy-server-jar target 을 실행하여 SEI 를 빌드합니다.
01
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02
<
project
name
=
"WiseOne 2.0 - generate webservices"
basedir
=
"."
>
04
<
property
environment
=
"env"
/>
05
<
property
name
=
"jdk.home"
value
=
"${env.JAVA_HOME}"
/>
06
<
property
name
=
"metro.home"
value
=
"${env.METRO_HOME}"
/>
07
<
property
name
=
"build.home"
value
=
"${basedir}/build"
/>
08
<
property
name
=
"build.classes.home"
value
=
"${build.home}/classes"
/>
09
<
property
name
=
"deploy.server.library"
10
value
=
"${build.home}/com.idstrust.wiseone.engine.gw.webservice.jar"
/>
12
<
taskdef
name
=
"apt"
classname
=
"com.sun.tools.ws.ant.Apt"
>
13
<
classpath
refid
=
"jaxws.classpath"
/>
16
<
taskdef
name
=
"wsimport"
classname
=
"com.sun.tools.ws.ant.WsImport"
>
17
<
classpath
refid
=
"jaxws.classpath"
/>
20
<
path
id
=
"jaxws.classpath"
>
21
<
pathelement
location
=
"${basedir}/bin"
/>
22
<
pathelement
location
=
"${jdk.home}/lib/tools.jar"
/>
23
<
fileset
dir
=
"${metro.home}/lib"
>
24
<
include
name
=
"*.jar"
/>
25
<
exclude
name
=
"j2ee.jar"
/>
30
<
echo
message
=
"빌드 경로를 초기화합니다."
/>
31
<
mkdir
dir
=
"${build.classes.home}"
/>
34
<
target
name
=
"build-server-java"
depends
=
"setup"
>
35
<
echo
message
=
"SEI 를 빌드합니다."
/>
40
sourcedestdir
=
"${build.classes.home}"
41
sourcepath
=
"${build.classes.home}"
>
43
<
path
refid
=
"jaxws.classpath"
/>
44
<
pathelement
location
=
"${basedir}/src"
/>
46
<
option
key
=
"r"
value
=
"${build.home}"
/>
47
<
source
dir
=
"${basedir}/src"
>
48
<
include
name
=
"**/webservice/**/*.java"
/>
53
<
target
name
=
"deploy-server-jar"
depends
=
"build-server-java"
>
54
<
echo
message
=
"서버 라이브러리를 배포합니다."
/>
56
<
jar
destfile
=
"${deploy.server.library}"
basedir
=
"${build.classes.home}"
/>
57
<
delete
dir
=
"${build.classes.home}"
/>
60
<
target
name
=
"build-client-java"
depends
=
"setup"
>
61
<
echo
message
=
"wsdl로 클라이언트 소스를 생성합니다."
/>
66
package
=
"${client.package}"
67
destdir
=
"${build.classes.home}"
68
wsdl
=
"${client.wsdl}"
>
72
<
target
name
=
"deploy-client-jar"
depends
=
"build-client-java"
>
73
<
echo
message
=
"클라이언트 라이브러리를 배포합니다."
/>
75
<
jar
destfile
=
"${build.home}/${client.package}.jar"
basedir
=
"${build.classes.home}"
/>
76
<
delete
dir
=
"${build.classes.home}"
/>
79
<
target
name
=
"generate-WorkflowFormWebService"
>
80
<
property
name
=
"client.package"
value
=
"com.idstrust.wiseone.engine.gw.webservice.workflowform"
/>
82
<
antcall
target
=
"deploy-client-jar"
/>
빌드된 서버쪽 jar 파일 내부를 보면 SEI 패키지 경로의 jaxws 서브패키지에 클래스들이 생성됩니다.
Spring 설정 xml 을 아래와 같이 구성합니다.
Spring 에서 제공하는 SimpleJaxWsServiceExporter 를 이용하여 서비스를 공개합니다.
01
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
07
<
bean
class
=
"org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"
>
11
<
bean
id
=
"workflowFormWebService"
class
=
"com.idstrust.wiseone.engine.gw.webservice.workflowform.WorkflowFormWebService"
>
12
<
property
name
=
"service"
ref
=
"workflowFormService"
/>
WAS (Tomcat) 의 WEB-INF/lib 폴더에 서버쪽 jar 를 배포하고 web.xml 에 Spring 설정을 추가합니다.
3
<
param-name
>contextConfigLocation</
param-name
>
6
classpath:com/idstrust/wiseone/engine/gw/conf/webserviceContext.xml
서버를 실행시키고 http://localhost:9999/WorkflowFormWebService?wsdl 에 접속해서 아래와 같은 wsdl 이 나오면
서버쪽 배포는 성공한 것입니다.
이제는 클라이언트 쪽 소스를 만들어서 테스트를 해봐야겠죠?
build.xml 의 generate-WorkflowFormWebService target 을 실행시키면 클라이언트 소스가 jar로 묶여서 나옵니다.
jar 를 풀어서 보면 아래와 같은 파일들이 있습니다. 저기 아래보이는 WorkflowFormWebService 가 serviceInterface 입니다.
위에 있는 wsdl 파일을 참조하여 아래 내용을 채워 넣습니다.
01
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
07
<
bean
id
=
"workflowFormWebService"
class
=
"org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"
>
08
<
property
name
=
"serviceInterface"
value
=
"com.idstrust.wiseone.engine.gw.webservice.workflowform.WorkflowFormWebService"
/>
11
<
property
name
=
"serviceName"
value
=
"WorkflowFormWebService"
/>
12
<
property
name
=
"portName"
value
=
"WorkflowFormWebServicePort"
/>
클라이언트 소스 테스트는 아래와 같이...
1
BeanFactory factory =
new
ClassPathXmlApplicationContext(
2
"com/idstrust/wiseone/formwizard/webservice/conf/webservicesContext.xml"
);
3
WorkflowFormWebService service =
4
(WorkflowFormWebService) factory.getBean(
"workflowFormWebService"
);
6
for
(FormCategory formCategory : service.getRootFormCategories()) {
7
System.out.println(formCategory.getName());
접기
별도의 테스트 소스를 만들어서 올리고 싶지만 시간이 없는 관계로 이렇게 되었습니다.
나중에 시간이 되면 스크린캐스트로다가 샤샥...