2012-03-02 14 views
6

tôi có một module, nơi tôi có lược đồ XSD của tôi, nơi một schema có thể tham khảo một sử dụng đường dẫn tương đối khác trong vị trí schema:Publishing tĩnh WSDL và XSD schema có liên quan sử dụng Spring WS

<xs:import namespace="http://my.namespace.org" schemaLocation="../mypackage/my.xsd"/> 

Ở đây tôi cũng xin bằng cách sử dụng xjc để tạo ra các hạt Jaxb từ các lược đồ xsd này.

Bây giờ tôi có một mô-đun trong đó dịch vụ web của tôi là hoàn toàn, sử dụng spring-ws (2.0.4). Và tôi muốn sử dụng WSDL tĩnh và xuất bản nó với các lược đồ xsd, nơi các vị trí lược đồ sẽ được chuyển thành URL như 'http://myerver.url.com/my.xsd'.

Câu hỏi đặt ra là làm thế nào để đạt được điều này một cách thanh lịch?

(Hoặc kết hợp XSD thành một lược đồ và đến WSDL)

(Về lý thuyết tôi có thể chuyển đổi những XSD sử dụng một kịch bản và thêm chúng vào các nguồn lực (XSD và wsdl) cho một (dispatcher mùa xuân) servlet nhưng có vẻ như tôi không thoải mái)

+0

bình luận nhanh ... bạn sẽ không thể kết hợp các XSD thành một kể từ khi bạn đang sử dụng câu lệnh < xs: import />; bạn chỉ có thể có một vùng tên đích trên mỗi tệp XSD. Bạn có thể, tuy nhiên, nội tuyến tất cả các XSD, không có vấn đề không gian tên, theo phần wsdl: types - trong trường hợp đó tất cả các nhập khẩu của bạn sẽ giảm các thuộc tính schemaLocation. Nhiều hơn sau ... –

+0

Xin chào, những gì tôi không muốn làm là in hướng dẫn sử dụng này. Vì vậy, giải pháp này là nếu nó có thể được thực hiện mà không có nhiều rắc rối, như sử dụng một lib chung mà nó cho tôi. – csviri

+0

Cuối cùng giải quyết nó bằng cách thực hiện servlet riêng. – csviri

Trả lời

9

Dịch vụ web mùa xuân có cách để thực hiện nó một cách thanh lịch. Tất cả bạn cần làm là xác định một bean SimpleXsdSchema với id đúng (mà sẽ được sử dụng như tên xsd mà không XSD) trong file xml định nghĩa bean, một cái gì đó như dưới đây

<bean id="my" 
     class="org.springframework.xml.xsd.SimpleXsdSchema"> 
     <property 
      name="xsd" 
      value="/mypackage/my.xsd"> 
     </property> 
</bean> 

Xem thêm thông tin (bao gồm cả một ví dụ) có thể được tìm thấy tại liên kết sau: Static WSDL with imported XML Schema in Spring Web Service

+0

Điều đó cũng hoạt động với WSDL động – mwhs

2

Dưới đây là cấu hình JAva để lộ lược đồ. Điều này làm việc cho tôi. Xin lưu ý rằng tên lược đồ phải khớp với tên Bean và tên phương thức. Điều này rất quan trọng để làm việc này. Vì vậy, tôi giữ tên XSD và Bean tên là "CustomerDetailsSchema" và chắc chắn rằng các nhà xây dựng cho getCustomerDetails cũng khớp với tên

@Bean(name = "customerDetails") 
public DefaultWsdl11Definition getCustomerDetails(XsdSchema CustomerDetailsSchema) { 
    DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition(); 
    wsdl11Definition.setPortTypeName("..."); 
    wsdl11Definition.setServiceName("..."); 
    wsdl11Definition.setLocationUri("/webservice"); 
    wsdl11Definition.setTargetNamespace("..."); 
    wsdl11Definition.setSchema(CustomerDetailsSchema); 
    return wsdl11Definition; 
} 

@Bean(name = "CustomerDetailsSchema") 
public XsdSchema CustomerDetailsSchema() { 
    return new SimpleXsdSchema(new ClassPathResource("schemas/CustomerDetailsSchema.xsd")); 
} 
Các vấn đề liên quan