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를 사용하는 방법을 배웁니다.