Я работаю над небольшим проектом мультимодуля в Знатоке. Мы разделили UI от слоя базы данных с помощью веб-сервисов, и благодаря jaxws-maven-plugin, создание WSDL и клиента WS более или менее обрабатывается для нас. (Плагин является по существу оберткой вокруг wsgen и wsimport.) Пока неплохо.
Проблема возникает, когда я пробую к безопасности уровня WSIT в изображение. NetBeans позволяет мне генерировать метаданные безопасности легко, но wsimport кажется абсолютно неспособным к контакту с чем-либо вне Основного подлинного уровня безопасности.
Вот наш текущий, небезопасный способ назвать wsimport во время сборки Знатока:
<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-совместимого клиента, застревают я отказывающийся от Знатока и jaxws плагина в целом? Существует ли способ заставить клиент WSIT автоматически генерировать? Или я должен буду генерировать клиент вручную?
Сообщите мне, нужна ли Вам какая-либо дополнительная информация вне того, что я записал здесь. Я развертываюсь к Tomcat, хотя это, кажется, не проблема, как Знаток кажется счастливым вытянуть Метро в развернутый ВОЕННЫЙ файл.
Заранее спасибо!
Править: После большого проигрывания вокруг с 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 в тестирование и производство. Мы играем вокруг с несколькими различными стратегиями управления этим, но мы, вероятно, закончим тем, что установили переменные среды в Гудзоне для сборки к каждой среде.
Скрипка с конфигурацией 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>
И наконец, конечно, удостоверяются, что все Ваши проекты, которые должны будут назвать веб-сервисы, имеют зависимость от Метро, правильно настроенную.
Разве вы не должны просто предоставить клиентские файлы конфигурации WSIT для клиента? Чего именно вы ожидаете от wsimport
?
Изменить: Как подразумевается, документ WSIT описывает два файла конфигурации на стороне клиента: wsit-client.xml
и {имя файла wsdl} .xml
и:
При запуске клиента эти файлы должны находиться в пути к классам, либо в корне пути к классам (т.е. сборка / классы), либо в каталоге META-INF в корне пути к классам.
При переносе в проект Maven естественным расположением этих файлов будет папка src / main / resources
или src / main / resources / META-INF
. Лично я предпочитаю помещать их в META-INF.