2010-01-19 23 views
7

Chúng tôi đã được cung cấp một lược đồ wsdl và xsd bởi một công ty mà chúng tôi đang làm việc qua email. Các dịch vụ web chúng ta đang giao tiếp với được truy cập thông qua một đường hầm IPsec. Có các tham chiếu cục bộ (ở phần cuối của chúng) trong WSDL được công bố có nghĩa là chúng ta không thể tiêu thụ nó.Tạo ứng dụng khách dịch vụ web với một wsdl đã biết nhưng không thể truy cập được

Câu hỏi thứ nhất: Đây có phải là thiết lập chung không? Tôi nghĩ rằng điểm có một WSDL không chỉ để xác định hợp đồng mà còn để lộ dịch vụ cho người tiêu dùng.

Tôi có thể dễ dàng tạo mã khách/máy chủ khỏi WSDL được cung cấp bằng wsimport, wsconsume, v.v. Tôi biết khi nào khách hàng được tạo của tôi thực hiện cuộc gọi đến dịch vụ đã tạo của tôi, nó tạo ra thông báo chính xác mà tôi cần.

Câu hỏi thứ hai: Có cách nào dễ dàng để định tuyến địa chỉ này đến một địa chỉ xà phòng khác không?

Tôi chỉ muốn để có thể làm điều gì đó như:

SalesTaxService svc = new SalesTaxService(); 
SalesTax tax = svc.getSalesTaxPort() 
tax.getRate("NY"); 

Nhưng không phải sử dụng địa chỉ xà phòng được định nghĩa trong WSDL. Tôi muốn tránh viết một loạt các khách hàng gửi cho mỗi phương pháp.

Tôi có thiếu gì đó không?

* Để phản hồi người trượt tuyết: Đây là những gì đã được tạo. Nó mặc định để wsdlLocation như một tên nhún vai

@WebServiceClient(name = "SomeService") 
    public class SomeService_Service extends Service { 

    public SomeService_Service(URL wsdlLocation, QName serviceName) { 
     super(wsdlLocation, serviceName);    
    } 

    public SomeService_Service(URL wsdlLocation) { 
     super(wsdlLocation, new QName("urn:some_service", "SomeService")); 
    } 
    } 
+0

Xem thêm http: // stackoverflow. com/a/863561/147763 –

Trả lời

3

Vì vậy, tôi đã tìm ra lý do tại sao tôi gặp sự cố. Tôi đã giả định rằng wsdlLocation phải là WSDL mà dịch vụ thực tế đã được xuất bản. Điều này tất nhiên không phải là trường hợp. Giải pháp là gói một WSDL cục bộ bằng SOAP chính xác: Địa chỉ cho dịch vụ thực tế vào máy khách.

chỉnh sửa tôi phát hiện ra rằng bạn có thể thay đổi địa chỉ điểm cuối lập trình mà không cần phải thay đổi WSDL thực tế:

HelloService service = new HelloService (
    this.getClass().getResource("originalHello.wsdl"), 
    new QName("http://example.org/hello", "HelloService ")); 
HelloPort proxy = service.getHelloPort(); 

Map<String, Object> ctxt = ((BindingProvider)proxy).getRequestContext(); 
ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192); 
ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://new/endpointaddress"); 

proxy.sayHello("Hello World!"); 

tín dụng đi vào: Jianming Li

5

Tôi nghĩ điểm của việc có một WSDL không chỉ để xác định hợp đồng nhưng cũng để lộ các dịch vụ cho người tiêu dùng .

Không, WSDL hoàn toàn là công cụ mô tả, nó không có vai trò thời gian thực. Dịch vụ web hoạt động hoàn toàn độc lập với WSDL. Nó không phải là không phổ biến cho WSDL không được tiếp xúc.

Có cách nào dễ dàng để định tuyến số này đến địa chỉ xà phòng khác không?

Điều đó hoàn toàn phụ thuộc vào việc triển khai dịch vụ web nào bạn đang sử dụng và bạn không nói, mặc dù tôi đoán là JAX-WS. Nếu đó là trường hợp, các tạo phẩm mà các công cụ của JAX-WS tạo ra cho phép bạn chuyển vào URL tới các trình tạo sơ khai trình khách, tôi nghĩ vậy.

+0

+1 để tạo sơ khai. –

+0

Cảm ơn bạn đã trả lời.Có, tôi đang sử dụng JAX-WS. Vấn đề là URL tôi sẽ chuyển vào là của WSDL không thể truy cập được. Tôi có thể tạo ra dịch vụ của riêng mình và hướng máy khách đến thực hiện dịch vụ của riêng tôi nhưng điều đó sẽ không đi đến SOAP thực tế: Địa chỉ mà tôi muốn giao tiếp với. – jgrowl

+0

Bạn có chắc chắn không? Tôi nghĩ rằng URL để các nhà xây dựng sơ khai là URL của điểm cuối dịch vụ web, không phải là URL của WSDL. Đây là lý do tại sao tôi không thích JAX-WS ..... tốt, một trong những lý do ... – skaffman

Các vấn đề liên quan