JAX-WS를 사용하는 Apache CXF
이 JAX-WS 애플리케이션에서는 이전 POJO 애플리케이션과 같은 Apache CXF 우선 접근 방식을 사용합니다. 따라서 먼저 웹 서비스를위한 인터페이스를 생성합니다.
서비스 인터페이스 선언
앞의 경우와 마찬가지로 greeting이라는 인터페이스 메서드가 하나만있는 사소한 서비스를 만듭니다. 서비스 인터페이스의 코드는 다음과 같습니다.
//HelloWorld.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String greetings(String text);
}
인터페이스에 @WebService꼬리표. 다음으로이 인터페이스를 구현합니다.
웹 인터페이스 구현
웹 인터페이스의 구현은 다음과 같습니다.
//HelloWorldImpl.java
package com.tutorialspoint.cxf.jaxws.helloworld;
public class HelloWorldImpl implements HelloWorld {
@Override
public String greetings(String name) {
return ("hi " + name);
}
}
인사 방법은 다음과 같이 주석 처리됩니다. @Override꼬리표. 이 메서드는 호출자에게 "hi"메시지를 반환합니다.
다음으로 서버 개발을위한 코드를 작성합니다.
서버 개발
POJO 애플리케이션과 달리 이제 CXF에서 제공하는 Endpoint 클래스를 사용하여 서비스를 게시하여 인터페이스를 분리합니다. 이것은 다음 두 줄의 코드에서 수행됩니다.
HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish(
"http://localhost:9090/HelloServerPort",
implementor,
new LoggingFeature()
);
게시 메소드의 첫 번째 매개 변수는 클라이언트가 서비스를 사용할 수있는 URL을 지정합니다. 두 번째 매개 변수는 서비스의 구현 클래스를 지정합니다. 서버의 전체 코드는 다음과 같습니다.
//Server.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.ws.Endpoint;
import org.apache.cxf.ext.logging.LoggingFeature;
public class Server {
public static void main(String[] args) throws Exception {
HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish("http://localhost:9090/HelloServerPort",
implementor,
new LoggingFeature());
System.out.println("Server ready...");
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting ...");
System.exit(0);
}
}
서버를 배포하려면 아래 나열된대로 프로젝트를 몇 가지 더 수정해야합니다.
서버 배포
마지막으로 서버 애플리케이션을 배포하려면 pom.xml에서 한 번 더 수정하여 애플리케이션을 웹 애플리케이션으로 설정해야합니다. 추가해야하는 코드pom.xml 아래에 주어진다-
<profiles>
<profile>
<id>server</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.jaxws.helloworld.Server
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
애플리케이션을 배포하기 전에 프로젝트에 두 개의 파일을 더 추가해야합니다. 아래 스크린 샷에 나와 있습니다.
이 파일은 다음에 대한 매핑을 정의하는 CXF 표준 파일입니다. CXFServlet. 내 코드web.xml 파일은 빠른 참조를 위해 여기에 표시됩니다.
//Web.xml
<?xml version = "1.0" encoding = "UTF-8"??>
<web-app xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>cxf</display-name>
<servlet>
<description>Apache CXF Endpoint</description>
<display-name>cxf</display-name>
<servlet-name>cxf</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>
1
</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>
cxf
</servlet-name>
<url-pattern>
/services/*
</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
에서 cxf-servlet.xml,서비스 엔드 포인트에 대한 속성을 선언합니다. 이것은 아래 코드 스 니펫에 나와 있습니다.
<beans ...>
<jaxws:endpoint xmlns:helloworld = "http://tutorialspoint.com/"
id = "helloHTTP"
address = "http://localhost:9090/HelloServerPort"
serviceName = "helloworld:HelloServiceService"
endpointName = "helloworld:HelloServicePort">
</jaxws:endpoint>
</beans>
여기에서 서비스 엔드 포인트의 ID, 서비스를 사용할 수있는 주소, 서비스 이름 및 엔드 포인트 이름을 정의합니다. 이제 서비스가 CXF 서블릿에 의해 라우팅되고 처리되는 방법을 배웠습니다.
최종 pom.xml
그만큼 pom.xml몇 가지 더 많은 종속성이 포함됩니다. 모든 종속성을 설명하는 대신 아래에 pom.xml의 최종 버전을 포함했습니다.
<?xml version = "1.0" encoding = "UTF-8"??>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint</groupId>
<artifactId>cxf-jaxws</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<profiles>
<profile>
<id>server</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.jaxws.helloworld.Server
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>client</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
<goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.jaxws.helloworld.Client
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-features-logging</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
</project>
이 튜토리얼의 뒷부분에서 배우게 될 클라이언트 구축을위한 프로필도 포함되어 있습니다.
HelloWorld 서비스 실행
이제 웹앱을 실행할 준비가되었습니다. 명령 창에서 다음 명령을 사용하여 빌드 스크립트를 실행합니다.
mvn clean install
mvn -Pserver
콘솔에 다음 메시지가 표시됩니다.
INFO: Setting the server's publish address to be http://localhost:9090/HelloServerPort
Server ready…
이전과 마찬가지로 브라우저에서 서버 URL을 열어 서버를 테스트 할 수 있습니다.
작업을 지정하지 않았으므로 응용 프로그램에서 오류 메시지 만 브라우저에 반환합니다.
이제 ?wsdl URL에 다음과 같은 출력이 표시됩니다.
따라서 서버 응용 프로그램이 예상대로 실행됩니다. 다음과 같은 SOAP 클라이언트를 사용할 수 있습니다.Postman 서비스를 추가로 테스트하기 위해 앞서 설명했습니다.
다음 섹션에서는 서비스를 사용하는 클라이언트를 작성하는 방법을 배웁니다.
클라이언트 개발
CXF 애플리케이션에서 클라이언트를 작성하는 것은 서버를 작성하는 것만 큼 간단합니다. 다음은 클라이언트를위한 완전한 코드입니다.
//Client.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
public final class Client {
private static final QName SERVICE_NAME
= new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
"HelloWorld");
private static final QName PORT_NAME
= new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
"HelloWorldPort");
private Client() {
}
public static void main(String[] args) throws Exception {
Service service = Service.create(SERVICE_NAME);
System.out.println("service created");
String endpointAddress = "http://localhost:9090/HelloServerPort";
service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
endpointAddress);
HelloWorld hw = service.getPort(HelloWorld.class);
System.out.println(hw.greetings("World"));
}
}
여기에서는 제공된 CXF를 사용합니다. Service알려진 서비스에 바인딩 할 클래스. 우리는create 에 방법 Service서비스의 인스턴스를 가져 오는 클래스. 우리는 다음을 호출하여 알려진 포트를 설정합니다.addPort 에 방법 service 예.
이제 서비스를 사용할 준비가되었습니다. 먼저 다음을 호출하여 서비스 인터페이스를 가져옵니다. getPort 에 방법 service예. 마지막으로 우리는greetings 콘솔에 인사말 메시지를 인쇄하는 방법.
이제 Apache CXF-First 접근 방식을 사용하여 CXF의 기본 사항을 배웠으므로 이제 다음 장에서 WSDL-First 접근 방식과 함께 CXF를 사용하는 방법을 배웁니다.