웹 서비스 URL 끝점을 변경하는 방법은 무엇입니까?


101

Eclipse 'wsdl의 웹 서비스 클라이언트'를 사용하여 JBoss 유틸리티 (JAX-WS 호환 가능)를 사용하여 웹 서비스 클라이언트를 생성했습니다.

그래서 제가 제공 한 유일한 것은 웹 서비스 WSDL에 대한 URL이었습니다.

이제 웹 서비스 제공자가 웹 서비스의 "클라이언트 엔드 포인트 애플리케이션 액세스 URL"을 변경하라고합니다.

그것은 무엇이며 어떻게 변경합니까?


새 URL로 동일한 Eclipse 마법사를 사용하여 다시 만들 수 있습니까?
Thilo

웹 서비스 공급자에게 wsdl에 대한 새 URL이 필요하다고 말한 다음 Eclipse 마법사와 함께 사용하여 클라이언트를 재생성하십시오.
systempuntoout

@Thilo @systemputoout GUYS, 문제는 그들이 동일한 WSDL URL을 가지고 있다는 것입니다! 확실하지 않지만 Axis에서 웹 서비스를 호출 할 때 URL을 제공 할 수있는 것 같습니다. JAX-WS에서는 "런타임 중 클라이언트 엔드 포인트"를 변경할 수 없습니다. 어떤 아이디어라도?
EugeneP

1
파스칼 Thivent @ 인용 @systempuntoout : "URL 또는 엔드 포인트 클라이언트 응용 프로그램 액세스"
EugeneP

1
이 문장에 대한 나의 이해는 "클라이언트가 서비스 엔드 포인트에 액세스합니다. 엔드 포인트 위치가 변경되었습니다"입니다. 그리고 이것은 의미가 있습니다.
Pascal Thivent

답변:


174

IMO, 공급자는 클라이언트 엔드 포인트가 아닌 서비스 엔드 포인트 (예 : 웹 서비스에 도달 할 위치)를 변경하라고 말합니다 (이게 무엇인지 모르겠습니다). 서비스 엔드 포인트를 변경하려면 기본적으로 두 가지 옵션이 있습니다.

바인딩 공급자를 사용하여 끝점 URL 설정

첫 번째 옵션은 (모든 프록시가 인터페이스를 구현 함 ) 의 BindingProvider.ENDPOINT_ADDRESS_PROPERTY속성 값 을 변경하는 것입니다 .BindingProviderjavax.xml.ws.BindingProvider

...
EchoService service = new EchoService();
Echo port = service.getEchoPort();

/* Set NEW Endpoint Location */
String endpointURL = "http://NEW_ENDPOINT_URL";
BindingProvider bp = (BindingProvider)port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);

System.out.println("Server said: " + echo.echo(args[0]));
...

단점은 원본 WSDL에 여전히 액세스 할 수있는 경우에만 작동한다는 것입니다. 권장하지 않습니다.

WSDL을 사용하여 엔드 포인트 URL 가져 오기

두 번째 옵션은 WSDL에서 엔드 포인트 URL을 가져 오는 것입니다.

...
URL newEndpoint = new URL("NEW_ENDPOINT_URL");
QName qname = new QName("http://ws.mycompany.tld","EchoService"); 

EchoService service = new EchoService(newEndpoint, qname);
Echo port = service.getEchoPort();

System.out.println("Server said: " + echo.echo(args[0]));
...

7
두 번째 코드 블록에 오류가 있다고 생각합니다. URL이 아니어야합니다. newEndpoint = new URL ( "WSDL_URL"); 첫 번째 줄에 ??
Jaime Hablutzel

3
여기 튜토리얼 링크가 있습니다. tugdualgrall.blogspot.com/2009/02/…
shareef

12
최신 wsimport도구는 get[Service]Port더 이상 메서드를 사용하여 코드를 생성하지 않는다는 점을 지적 할 가치가 있습니다. 대신 get[Service]결과 개체를으로 호출 하고 캐스팅하여 BindingProvider이러한 종류의 속성을 설정합니다.
Christopher Schultz

wsimport 팁에 @ChristopherSchultz에게 감사드립니다! 그 데프. 우리를 위해 일
Cuga

1
cxf 생성 스텁 코드에서 이해하는 한 위의 두 번째 옵션은 서비스 URL이 아닌 wsdl URL을 변경합니다. 내가 뭔가를 놓치고 있습니까?
cacert

16

여기에 설명을 추가하기 위해 서비스를 생성 할 때 서비스 클래스는 기본 'wsdlLocation'을 사용합니다. 기본 'wsdlLocation'은 클래스가 wsdl에서 빌드 될 때 삽입되었습니다. 따라서 SomeService라는 서비스 클래스가 있고 다음과 같은 인스턴스를 생성하는 경우 :

SomeService someService = new SomeService();

SomeService 내부를 살펴보면 생성자가 다음과 같이 보이는 것을 볼 수 있습니다.

public SomeService() {
        super(__getWsdlLocation(), SOMESERVICE_QNAME);
}

따라서 다른 URL을 가리 키도록하려면 URL 인수를받는 생성자를 사용하면됩니다 (qname 및 기능 설정을위한 6 개의 생성자가 있습니다). 예를 들어, 포트 9999에서 수신 대기하는 로컬 TCP / IP 모니터를 설정하고 해당 URL로 리디렉션하려는 경우 :

URL newWsdlLocation = new URL("http://theServerName:9999/somePath");
SomeService someService = new SomeService(newWsdlLocation);

그러면 서비스 내에서이 생성자가 호출됩니다.

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}

2
반드시 그런 것은 아닙니다. Apache CXF의 wsdl2java로 생성 된 서비스가 있으며 새 wsdl 위치를 생성자에 전달하더라도 해당 포트는 여전히 컴파일 / 생성시 설정된 위치에 바인딩을 시도합니다 (선택 사항을 남기지 않고 포트를 BindingProvider 및 그 요청 문맥지도에 새 주소를 설정).
luis.espinal

1
@Luis-정확히 무엇을보고 있는지 알기 어렵지만 디버그하면 javax Provider 클래스에 대한 호출을 확인한 다음 새 wsdl 위치로 엔드 포인트를 생성하려고 시도해야합니다 (JAX-WS 2.0을 사용한다고 가정). +). 그런 다음 서비스 내에서 getPort 호출은 super.getPort를 호출해야합니다.이 호출에는 serviceDelegate 객체에 새 포트가 설정되어 있습니다. 이것이 JAX-WS 2.0의 javax.xml.ws.Service에서 작동하는 방식입니다. 나는 슈퍼 콜에 중단 점을 놓고 거기에서 조사했습니다.
MattC

0

기존 주소 속성 을 변경 하기 위해 @Femi까지 가지 않을 것 입니다. 정의 섹션에 새 서비스를 쉽게 추가 할 수 있습니다.

<wsdl:service name="serviceMethodName_2">
  <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
    <soap:address location="http://new_end_point_adress"/>
  </wsdl:port>
</wsdl:service>

이것은 WSDL을 Java로 재 컴파일 할 필요가 없으며 업데이트하는 것이 BindingProvider 옵션을 사용하는 것보다 더 어렵지 않습니다.


-6

끝 주소 속성을 변경하려면 wsdl 파일을 편집합니다.

<wsdl:definitions.......
  <wsdl:service name="serviceMethodName">
    <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
      <soap:address location="http://service_end_point_adress"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

11
대부분의 경우 WSDL은 사용자에게 부과되며 변경해서는 안됩니다. 더 중요한 것은 한 환경에서 다른 환경으로 (테스트 대 라이브) 엔드 포인트 URL이 변경 될 수 있다는 것입니다.이 경우 아무도 wsdl을 조정하고 다시 컴파일하기를 원하지 않습니다.
Myobis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.