2012-03-02 16 views
6

mam jeden moduł, gdzie mam moje schematy XSD, gdzie jeden schemat może odwoływać się do innego za pomocą ścieżki względnej wewnątrz lokalizacji schematu:wydawnictwa Static WSDL i pokrewne schematy XSD przy użyciu Wiosna WS

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

Tutaj jestem też używanie xjc do generowania ziaren Jaxb z tych schematów xsd.

Teraz mam moduł, w którym jest moja usługa sieciowa jest impemetemetented, używając spring-ws (2.0.4). I chcę użyć statycznego WSDL i opublikować go za pomocą schematów xsd, gdzie lokalizacje schematu zostaną przekształcone na adres URL, taki jak "http://myerver.url.com/my.xsd".

Pytanie, w jaki sposób można to elegancko osiągnąć?

(Ewentualnie połączyć XSD do jednego schematu i że WSDL)

(Teoretycznie mogę przekształcić te XSD przy użyciu skryptu i dodać je do zasobów (XSD i WSDL) do (wiosna dyspozytora) servlet ale nie wydaje mi się to bardzo wygodne)

+0

Krótki komentarz ... nie będzie w stanie połączyć w jedno XSD od ciebie używam instrukcji < xs: import />; możesz mieć tylko jedną docelową przestrzeń dla każdego pliku XSD. Można jednak wstawiać wszystkie XSD, bez względu na przestrzenie nazw, w sekcji WSDL: types - w takim przypadku wszystkie importowane obiekty powinny upuścić atrybuty schemaLocation. Więcej później ... –

+0

Cześć, nie chcę tego robić ręcznie. Tak więc rozwiązaniem jest, jeśli można to zrobić bez większych problemów, na przykład przy użyciu ogólnej biblioteki, która mi to robi. – csviri

+0

W końcu rozwiązany przez własną implementację serwletu. – csviri

Odpowiedz

9

Wiosenny serwis internetowy ma sposób na to, aby to zrobić naprawdę elegancko. Wszystko, co musisz zrobić, to określić SimpleXsdSchema Bean z prawej ID (który będzie używany jako nazwa xsd bez .XSD) w pliku xml definicji fasola, coś jak poniżej

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

Więcej informacji (w tym przykład) można znaleźć pod następującym linkiem: Static WSDL with imported XML Schema in Spring Web Service

+0

Działa to również z dynamicznym WSDL – mwhs

2

Poniżej znajduje się konfiguracja JAVA do ujawnienia schematu. To działało dla mnie. Należy pamiętać, że nazwa schematu powinna być zgodna z nazwą fasoli i nazwą metody. Jest to bardzo ważne, aby to zadziałało. Więc ja zachowałem nazwisko XSD i Bean nazwę jako „CustomerDetailsSchema” i upewnij się, że konstruktor getCustomerDetails pasuje również nazwę

@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")); 
}