Web hizmeti url uç noktası nasıl değiştirilir?


101

Eclipse 'wsdl'den' web hizmeti istemcisini kullanarak JBoss araçlarını (JAX-WS uyumlu) kullanarak bir web hizmeti istemcisi oluşturdum.

Yani, sağladığım tek şey bir web hizmeti WSDL'ye bir url idi.

Şimdi, web servis sağlayıcısı web servisinin "istemci uç nokta uygulama erişiminin url'sini" değiştirmemi söylüyor.

Nedir ve nasıl değiştirilir?


Yeni URL ile aynı Eclipse sihirbazını kullanarak şeyi yeniden oluşturabilir misiniz?
Thilo

Web servis sağlayıcısına wsdl için yeni url'ye ihtiyacınız olduğunu söyleyin, ardından istemciyi yeniden oluşturmak için Eclipse sihirbazıyla kullanın.
systempuntoout

@Thilo @systemputoout GUYS, sorun aynı WSDL URL'sine sahip olmalarıdır !! Emin değilim, ama bana öyle geliyor ki Axis'te web hizmetini çalıştırırken bir URL sağlayabilirsiniz. JAX-WS'de "çalışma zamanı sırasında istemci uç noktasını" değiştiremezsiniz. Herhangi bir fikriniz var mı çocuklar?
EugeneP

1
@ Pascal Thivent, @systempuntoout Cite: "İstemci uygulama erişimi için URL veya uç nokta"
EugeneP

1
Benim bu cümleyi anladığım kadarıyla "istemciler bir hizmet uç noktasına erişiyor; uç nokta konumu değişti". Ve bu mantıklı.
Pascal Thivent

Yanıtlar:


174

IMO, sağlayıcı size istemci uç noktasını değil, hizmet uç noktasını (yani web hizmetine nereden ulaşılacağını) değiştirmenizi söylüyor (bunun ne olabileceğini anlamıyorum). Hizmet uç noktasını değiştirmek için temelde iki seçeneğiniz vardır.

Uç nokta URL'sini ayarlamak için Bağlama Sağlayıcıyı kullanın

İlk seçenek, (her proxy arabirimi uygular ) BindingProvider.ENDPOINT_ADDRESS_PROPERTYözellik değerini değiştirmektir :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]));
...

Bunun dezavantajı, bunun yalnızca orijinal WSDL hala erişilebilir olduğunda çalışmasıdır. Tavsiye edilmez.

Uç nokta URL'sini almak için WSDL'yi kullanın

İkinci seçenek, WSDL'den uç nokta URL'sini almaktır.

...
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
İkinci kod bloğunda bir hata olduğunu düşünüyorum, URL newEndpoint = new URL ("WSDL_URL") olmamalıdır; ilk satırda mı?
Jaime Hablutzel

3
Burada bir öğretici bağlantısıdır tugdualgrall.blogspot.com/2009/02/...
Shareef'ten

12
Modern wsimportaraçların artık bir get[Service]Portyöntemle kod üretmediğini belirtmekte fayda var . Bunun yerine, bu tür özellikleri ayarlamak get[Service]için elde edilen nesneyi a çağırın ve çevirin BindingProvider.
Christopher Schultz

Wsimport ipucu için @ChristopherSchultz teşekkürler! Bu def. bizim için çalıştı
Cuga

1
Cxf tarafından oluşturulan saplama kodundan anladığım kadarıyla, yukarıdaki ikinci seçenek hizmet url'sini değil wsdl url'sini değiştiriyor. Bir şey mi kaçırıyorum?
cacert

16

Buraya biraz açıklama eklemek için, hizmetinizi oluşturduğunuzda, hizmet sınıfı, sınıf wsdl'den oluşturulduğunda içine eklenen varsayılan 'wsdlLocation'ı kullanır. Dolayısıyla, SomeService adında bir hizmet sınıfınız varsa ve bunun gibi bir örnek oluşturursanız:

SomeService someService = new SomeService();

SomeService'in içine bakarsanız, kurucunun şöyle göründüğünü göreceksiniz:

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

Dolayısıyla, başka bir URL'yi işaret etmesini istiyorsanız, yalnızca bir URL bağımsız değişkeni alan yapıcıyı kullanırsınız (qname ve özellikleri ayarlamak için 6 yapıcı vardır). Örneğin, 9999 numaralı bağlantı noktasını dinleyen yerel bir TCP / IP monitörü kurduysanız ve bu URL'ye yeniden yönlendirmek istiyorsanız:

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

ve bu, hizmet içindeki bu kurucuyu çağırır:

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

2
Şart değil. Apache CXF'nin wsdl2java'yla oluşturulmuş hizmetlerim var ve yeni wsdl konumunu kurucuya ilettiğimizde bile bağlantı noktaları, derleme / oluşturma zamanında ayarlanan konuma bağlanmaya çalışıyor (herhangi bir seçenek bırakmadan bağlantı noktasını BindingProvider'a yazmaktan başka bir seçenek bırakmadan) yeni adresi istek bağlam haritasında ayarlayın.)
luis.espinal

1
@Luis - Ne gördüğünüzü tam olarak bilmek zor, ancak hata ayıkladığınızda javax Sağlayıcı sınıfına yapılan çağrıyı görmeli ve ardından yeni wsdl konumunuzla uç noktayı oluşturmaya çalışmalısınız (JAX-WS 2.0 kullandığınızı varsayarak) +). Daha sonra, hizmetinizin içinde getPort çağrısı, yeni bağlantı noktanızı serviceDelegate nesnesinde ayarlayan super.getPort'u çağırmalıdır. JAX-WS 2.0'da javax.xml.ws.Service ile bu şekilde çalışması gerekir. Süper aramaya bir kesme noktası koyar ve oradan araştırırdım.
MattC

0

Mevcut adres özelliğini değiştirmek için @Femi kadar ileri gitmem . Tanımlar bölümüne kolayca yeni hizmetler ekleyebilirsiniz.

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

Bu, WSDL'nin Java'ya yeniden derlenmesini gerektirmez ve güncelleme yapmak, BindingProvider seçeneğini kullanmanızdan daha zor değildir (btw için çalışmadı).


-6

Bitiş adresi özelliğini değiştirmek için wsdl dosyanızı düzenleyin

<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
Çoğu durumda, WSDL size dayatılır ve sizin onu değiştirmemeniz gerekir. Daha da önemlisi, bir ortamdan diğerine (teste karşı canlı), uç nokta url'si muhtemelen değişecektir .. ve kimse bu durumda wsdl'yi değiştirip yeniden derlemek istemez.
Myobis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.