我答應用大約「正確」的東西來擴展這個答案。這是迄今爲止的進展,我仍然不能確定100%是正確的。稍後再詳細介紹。
這都是基於Oasis發佈的模式堆棧來定義XACML標準的XACML和SAML-P。 XSD已被收集到Commons-Schema模塊(未顯示)中,用於修復幾個Oasis錯誤,並使用JAX-B編譯爲Java類。這些類是下面描述的服務的基礎。 schema.episode.path和schema.catalog.path屬性指向此模塊中的文件。
我將每個服務(本例中爲PolicyService)分成兩個maven模塊。 PolicyService-SVC是服務和POM看起來是這樣的:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<executions>
<execution>
<id>Generate WSDL</id>
<phase>generate-resources</phase>
<goals>
<goal>wsgen</goal>
</goals>
<configuration>
<sei>com.technica.pbac.ps.PolicyService</sei>
<genWsdl>true</genWsdl>
<keep>true</keep>
<verbose>true</verbose>
<extension>true</extension>
<catalog>${schema.catalog.path}</catalog>
<xjcArg>-episode</xjcArg>
<xjcArg>${schema.episode.path}</xjcArg>
<xjcArg>-catalog</xjcArg>
<xjcArg>${schema.catalog.path}</xjcArg>
</configuration>
</execution>
</executions>
</plugin>
PolicyService代理是一般代理代碼,任何客戶端或服務可以用它來調用該服務(更多有關此問題的下面)。它的POM看起來是這樣的:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<executions>
<execution>
<!-- <phase>generate-sources</phase> -->
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlFiles>
<wsdlFile>localhost_8080/PolicyService-Svc/PolicyService.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>http://localhost:8080/PolicyService-Svc/PolicyService?WSDL</wsdlLocation>
<sourceDestDir>${project.build.directory}/generated-sources/jaxws</sourceDestDir>
<genWsdl>true</genWsdl>
<verbose>true</verbose>
<extension>true</extension>
<catalog>${schema.catalog.path}</catalog>
<xjcArg>-episode</xjcArg>
<xjcArg>${schema.episode.path}</xjcArg>
</configuration>
</execution>
</executions>
</plugin>
現在的問題,我會很感激的建議。儘管Commons-Schema爲所有模式提供了編譯的Java類,但wsgen堅持使用新生成的xsds生成wsdl,這些xsds稍有不同,並且在各種方式上稍微不正確。
作爲錯誤和不同的一個示例,SAML定義了與另一個模式中的同名衝突的擴展元素。所以我修好它在這樣的基礎下議院-架構:
<element name="Extensions" type="samlp:ExtensionsType">
<annotation>
<appinfo>
<jxb:class name="Extensions-SAML"/>
</appinfo>
</annotation>
</element>
但WSGEN/wsimport的這樣的矛盾再次變成了省略這種修正。對構建造成傷害和絕對致命。
另一種是省略所需包括所以日食驗證報告他們的錯誤,直到手動糾正。我的解決方法是定期將生成的wsdl和xsds從目標文件夾複製到src/main/webapp/WEB-Inf/wsdl,手動修復它們,並調整poms以使用此文件夾而不是目標中生成的文件夾。這適用於從非服務客戶端調用服務。我將同樣的wsdls和xsds複製到類似的客戶端文件夾中,並確保pom引用這些文件,而不是那些jaxws在該模塊中生成的文件。
當任何服務需要通過其代理調用另一個服務時,我無法解決問題。調用服務的代理jar(其重要基礎類的版本略有不同)現在與調用服務jar(基於Commons-Schema的JAXB生成的類)混合在一起,這不會造成任何麻煩。
有人能請指教嗎?謝謝!