Я работаю над небольшим мультимодульным проектом в Maven. Мы отделили пользовательский интерфейс от уровня базы данных с помощью веб-служб, и благодаря плагину jaxws-maven-нам создание клиента WSDL и WS более или менее решается. (Плагин по сути является оберткой для wsgen и wsimport.) Пока все хорошо.
Проблема возникает, когда я пытаюсь наложить безопасность WSIT на изображение. NetBeans позволяет мне легко генерировать метаданные безопасности, но wsimport кажется совершенно неспособным справиться с чем-либо, кроме уровня безопасности Basic-auth.
Вот наш текущий небезопасный способ вызова wsimport во время сборки Maven:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.10</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlUrls>
<wsdlUrl>${basedir}/../WebService/target/jaxws/wsgen/wsdl/WebService.wsdl</wsdlUrl>
</wsdlUrls>
<packageName>com.yourcompany.appname.ws.client</packageName>
<sourceDestDir>${basedir}/src/main/java</sourceDestDir>
<destDir>${basedir}/target/jaxws</destDir>
</configuration>
</execution>
</executions>
</plugin>
Я пытался поиграться с xauthFile, xadditionalHeaders, передавая javax.xml.ws.security.auth.username и пароль через args. Я также пытался использовать wsimport из командной строки для указания на сгенерированный Tomcat WSDL, который имеет дополнительную информацию о безопасности. Однако, похоже, ничто не меняет состав файлов, сгенерированных wsimport.
Так что я думаю, что мой вопрос здесь, чтобы получить WSIT-совместимый клиент, я застрял, отказавшись от Maven и плагина jaxws в целом? Есть ли способ получить клиент WSIT для автоматической генерации? Или мне нужно будет сгенерировать клиента вручную?
Дайте мне знать, если вам нужна дополнительная информация помимо того, что я здесь написал. Я внедряю в Tomcat, хотя это, похоже, не проблема, так как Maven, похоже, рад вставить Metro в развернутый файл WAR.
Заранее спасибо!
РЕДАКТИРОВАТЬ: После долгой игры с WSIT вот что сработало для меня.
Для начала используйте Netbeans для генерации клиента WSIT. Протестируйте его, чтобы убедиться, что он работает, а затем переместите файлы конфигурации WSIT (wsit-client.xml и [имя вашего веб-сервиса] .xml) в каталог META-INF клиентского проекта WS.
Соответствующим дополнением к вашему проекту с точки зрения безопасности является тег в веб-службе xml:
<wsp:Policy wsu:Id="WebPortBindingPolicy">
<wsp:ExactlyOne>
<wsp:All>
<sc:CallbackHandlerConfiguration wspp:visibility="private">
<sc:CallbackHandler default="wsitUser" name="usernameHandler"/>
<sc:CallbackHandler default="changeit" name="passwordHandler"/>
</sc:CallbackHandlerConfiguration>
<sc:TrustStore wspp:visibility="private" location="C:\Apps\apache-tomcat-6.0.24\certs\client-truststore.jks" type="JKS" storepass="changeit" peeralias="xws-security-server"/>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
Очевидно, что здесь есть некоторые жестко запрограммированные зависимости, которыми мы должны будем управлять во время нашей сборки. Пользователь, пароль, местоположение склада доверенных сертификатов и peeralias - все значения по умолчанию для разработки, и они будут меняться по мере перехода системы из dev в тестирование и производство. Мы играем с несколькими различными стратегиями для управления этим, но мы, вероятно, в конечном итоге установим переменные среды в Hudson для развертывания в каждой среде.
Немного поигрался с настройкой плагина Maven's jaxws. Мы генерируем WSDL как часть сборки, поэтому нам не нужно ссылаться на него локально. Вот тег плагина для команды wsimport в нашей цели клиента WS:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlUrls>
<wsdlUrl>${basedir}/../WebService/target/jaxws/wsgen/wsdl/WebService.wsdl</wsdlUrl>
</wsdlUrls>
<staleFile>${project.build.directory}/jaxws/stale/WebService.stale</staleFile>
<packageName>com.yourcompany.appname.ws.client</packageName>
<sourceDestDir>${basedir}/src/main/java</sourceDestDir>
<destDir>${basedir}/target/jaxws</destDir>
</configuration>
<id>wsimport-generate-WebService</id>
<phase>generate-sources</phase>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>webservices-api</artifactId>
<version>2.0-b30</version>
</dependency>
</dependencies>
<configuration>
<sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
<xnocompile>true</xnocompile>
<verbose>true</verbose>
<extension>true</extension>
</configuration>
</plugin>
И, наконец, конечно, убедитесь, что все ваши проекты, которым нужно будет вызывать веб-сервисы, имеют правильно настроенную зависимость Metro.