Java SE의 웹 서비스, Part 2 : SOAP 웹 서비스 만들기

JAX-WS는 SOAP 기반 웹 서비스를 지원합니다. Java SE 웹 서비스에 대한이 4 부작 시리즈의 2 부에서는 SOAP 기반 단위 변환 웹 서비스를 정의하고 기본 경량 HTTP 서버 (1 부에서 설명)를 통해이 웹 서비스를 로컬에서 빌드 한 다음 확인하고 서비스의 WSDL 문서를 해석합니다. , 단순 클라이언트에서 서비스에 액세스합니다.

단위 변환 웹 서비스 정의

내가 UC라고 명명 한 단위 변환 웹 서비스는 센티미터와 인치 사이, 화씨와 섭씨 사이를 변환하는 네 가지 함수로 구성됩니다. 이 예제는 단일 Java 클래스로 설계 할 수 있지만 Java 인터페이스 및 Java 클래스로 설계하여 모범 사례를 따르기로 선택했습니다. 목록 1은 웹 서비스의 UC인터페이스를 보여줍니다 .

목록 1. UC 웹 서비스의 서비스 엔드 포인트 인터페이스

package ca.javajeff.uc; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface UC { @WebMethod double c2f(double degrees); @WebMethod double cm2in(double cm); @WebMethod double f2c(double degrees); @WebMethod double in2cm(double in); }

UC추상 Java 메소드 측면에서 웹 서비스 인터페이스의 작업을 노출하는 Java 인터페이스 인 SEI (Service Endpoint Interface)를 설명 합니다. 클라이언트는 SEI를 통해 SOAP 기반 웹 서비스와 통신합니다.

UC@WebService주석을 통해 SEI로 선언됩니다 . Java 인터페이스 또는 클래스에 주석을 달면 매개 변수, 반환 값 및 선언 된 예외가있는 @WebService모든 public메서드는 JAX-RPC 1.1 사양의 섹션 5에 정의 된 규칙을 따릅니다. 때문 public방법은 인터페이스에 선언 될 수 있으며, public선언 할 때 예약어 불필요 c2f(), cm2in(), f2c(), 및 in2cm(). 이러한 메서드는 암시 적으로 public있습니다.

각 방법에도 주석이 달려 @WebMethod있습니다. 하지만 @WebMethod이 예에서는 필수적이지, 그 존재는 주석이 방법은 웹 서비스 조작을한다는 사실을 강화.

목록 2는 웹 서비스의 UCImpl클래스를 보여줍니다 .

Listing 2. UC 웹 서비스의 서비스 구현 빈

package ca.javajeff.uc; import javax.jws.WebService; @WebService(endpointInterface = "ca.javajeff.uc.UC") public class UCImpl implements UC { @Override public double c2f(double degrees) { return degrees * 9.0 / 5.0 + 32; } @Override public double cm2in(double cm) { return cm / 2.54; } @Override public double f2c(double degrees) { return (degrees - 32) * 5.0 / 9.0; } @Override public double in2cm(double in) { return in * 2.54; } }

UCImplSEI 구현을 제공하는 SIB (Service Implementation Bean)를 설명합니다 . 이 클래스는 @WebService(endpointInterface = "ca.javajeff.uc.UC")주석을 통해 SIB로 선언됩니다 . 이 endpointInterface요소는이 SIB를 SEI에 연결하며 나중에 제시되는 클라이언트 애플리케이션을 실행할 때 정의되지 않은 포트 유형 오류를 방지하는 데 필요합니다.

implements UC절은 절대적으로 필요하지 않습니다. 이 절이 없으면 UC인터페이스가 무시되고 중복됩니다. 그러나 implements UC컴파일러가 SEI의 메서드가 SIB에서 구현되었는지 확인할 수 있도록 유지하는 것이 좋습니다 .

@WebMethod이 주석은 일반적으로 SEI의 컨텍스트에서 사용되기 때문에 SIB의 메서드 헤더에는 주석 이 추가되지 않습니다 . 그러나 publicSIB에 메서드 (JAX-RPC 1.1 사양의 섹션 5에있는 규칙을 준수 함) 를 추가 하고이 메서드가 웹 서비스 작업을 노출하지 않는 경우 메서드 헤더에 주석을 추가합니다 @WebMethod(exclude = true). 할당 true@WebMethodexclude한 요소는 동작과 연관되는 것을 방지 방법.

이 웹 서비스는 클라이언트에서 액세스 할 수 있도록 게시 할 준비가되었습니다. 목록 3 UCPublisher은 기본 경량 HTTP 서버의 컨텍스트에서이 작업을 수행 하는 애플리케이션을 보여줍니다 .

목록 3. UC 게시

import javax.xml.ws.Endpoint; import ca.javajeff.uc.UCImpl; public class UCPublisher { public static void main(String[] args) { Endpoint.publish("//localhost:9901/UC", new UCImpl()); } }

웹 서비스 게시에는 EndPoint클래스의 Endpoint publish(String address, Object implementor)클래스 메서드에 대한 단일 호출이 포함됩니다 . address매개 변수를 식별 URI는 웹 서비스에 할당. 필자는 localhost(IP 주소 127.0.0.1과 동일) 및 포트 번호 9901(사용 가능할 가능성이 가장 높음 )를 지정하여 로컬 호스트에이 웹 서비스를 게시하도록 선택했습니다 . 또한 /UC게시 경로로 임의로 선택했습니다 . implementor매개 변수를 식별의 인스턴스 UC의 SIB.

publish()메서드는 지정된 implementor에서 지정된 개체에 대한 끝점을 만들고 게시하고 의 주석을 address사용하여 implementorWSDL (웹 서비스 정의 언어) 및 XML 스키마 문서를 만듭니다. 일부 기본 구성을 기반으로 JAX-WS 구현에서 필요한 서버 인프라를 작성하고 구성합니다. 또한이 메서드를 사용하면 응용 프로그램이 무기한 실행됩니다. (Windows 시스템에서는 Ctrl과 C 키를 동시에 눌러 애플리케이션을 종료합니다.)

웹 서비스 빌드 및 확인

이전에 정의 된 UC 웹 서비스를 구축하는 것은 어렵지 않습니다. 먼저 적절한 파일을 포함하는 적절한 디렉토리 구조를 만들어야합니다. 다음 단계를 수행하여이 작업을 완료하십시오.

  1. 현재 디렉터리 내에 디렉터리를 만듭니다 ca. 에서 디렉토리를 ca만듭니다 javajeff. 마지막으로에서 디렉토리를 javajeff만듭니다 uc.
  2. 목록 1을 UC.java소스 파일에 복사 하고이 파일을 ca/javajeff/uc.
  3. 목록 2를 UCImpl.java소스 파일에 복사 하고이 파일을 ca/javajeff/uc.
  4. 목록 3을 UCPublisher.java소스 파일에 복사 하고이 파일을 디렉토리가 포함 된 현재 디렉토리에 저장하십시오 ca.

다음 작업은 이러한 소스 파일을 컴파일하는 것입니다. 디렉토리를 변경하지 않았다고 가정하고 다음 명령을 실행하여 Java SE 9에서 이러한 소스 파일을 컴파일합니다 ( --add-modules java.xml.wsJava SE 6, 7 또는 8에서는 생략 ).

javac --add-modules java.xml.ws UCPublisher.java

이러한 소스 파일이 성공적으로 컴파일되면 다음 명령을 실행하여 Java 9에서이 응용 프로그램을 실행합니다 ( --add-modules java.xml.wsJava SE 6, 7 또는 8에서는 생략 ).

java --add-modules java.xml.ws UCPublisher

응용 프로그램이 실행되는 동안 웹 브라우저를 사용하여이 웹 서비스가 올바르게 실행되고 있는지 확인하고 해당 WSDL 문서에 액세스합니다. 자주 사용하는 웹 브라우저를 시작하고 주소 표시 줄에 다음 줄을 입력합니다.

//localhost:9901/UC

그림 1은 Google Chrome 웹 브라우저의 결과 웹 페이지를 보여줍니다.

그림 1. 게시 된 웹 서비스에 대한 자세한 정보를 제공하는 UC 웹 페이지

그림 1은 웹 서비스 엔드 포인트의 정규화 된 서비스 및 포트 이름을 보여줍니다. (패키지 이름이 uc.javajeff.ca대신 반전되었습니다 ca.javajeff.uc.) 클라이언트는 이러한 이름을 사용하여 서비스에 액세스합니다.

Figure 1 also presents the address URI of the Web service, the location of the Web service's WSDL document (the Web service URI suffixed by the ?wsdl query string), and the package-qualified name of the Web service implementation class.

Interpreting the web service's WSDL document

The location of the UC Web service's WSDL document is presented as a link. Click this link to view the WSDL document, whose contents are presented in Listing 4.

Listing 4. UC's WSDL document

A WSDL document is an XML document with a definitions root element, which makes a WSDL document nothing more than a set of definitions. This element includes various xmlns attributes for identifying various standard namespaces, along with targetNameSpace and name attributes:

  • The targetNamespace attribute creates a namespace for all user-defined elements in the WSDL document (such as the c2f element defined via the message element with this name). This namespace is used to distinguish between the user-defined elements of the current WSDL document and user-defined elements of imported WSDL documents, which are identified via WSDL's import element. In a similar fashion, the targetNamespace attribute that appears on an XML Schema-based file's schema element creates a namespace for its user-defined simple type elements, attribute elements, and complex type elements.
  • The name attribute identifies the Web service and is used only to document the service.

Nested within definitions are types, message, portType, binding, and service elements: