Я работаю над небольшим и многомодульным проектом в Maven. Мы отделили пользовательский интерфейс от уровня базы данных с помощью веб-служб, и благодаря плагину jaxws-maven создание WSDL и WS-клиента более или менее обрабатывается для нас. (Плагин по существу является оберткой вокруг wsgen и wsimport.) Пока все хорошо.WSIT, Maven и 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 и пароль через арг. Я также попытался использовать wsimport из командной строки, чтобы указать на WSDL, созданный Tomcat, который содержит дополнительную информацию о безопасности. Однако ничто не изменяет состав созданных wsimport файлов.
Итак, я думаю, мой вопрос здесь в том, чтобы получить WSIT-совместимый клиент, я оставил без изменений Maven и плагин jaxws вообще? Есть ли способ заставить клиента WSIT автоматически генерировать? Или мне нужно создать клиент вручную?
Сообщите мне, если вам нужна дополнительная информация, кроме того, что я здесь написал. Я развертываю Tomcat, хотя это, похоже, не проблема, так как Maven, похоже, с удовольствием вытащил Metro в развернутый WAR-файл.
Заранее благодарен!
EDIT: После многих игр с 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 от Maven. Мы генерируем 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 правильно настроить.
«Просто» частью этого является трюк. Сегодня я проделал большую работу, и после учебного курса WSIT я смог получить NetBeans для создания безопасного WS Client. Мне все еще не удалось заставить мой проект Maven играть счастливо с настройкой, но я рядом. Это мой первый безопасный веб-сервис, поэтому я учусь, когда я иду. Я, вероятно, отправлю свой собственный ответ в виде мини-учебника о том, как я это сделал, чтобы другие могли избежать некоторой боли, которую я пережил. Благодаря! – rtperson
@rtperson Я не говорю, что WSIT тривиален, но я все еще не понимаю, что вы ожидаете во время wsimport. AFAIK, предоставляя файлы конфигурации WSIT на стороне клиента, не влияет на генерацию клиентских артефактов. –
Паскаль, теперь, когда я видел, как фигуры подходят друг к другу, я знаю, что wsimport не будет делать ничего другого, чем сейчас, поэтому мне удалось пройти мимо этого. Но я еще не смог создать безопасный клиент WSIT через Maven. Я сейчас дома, и у меня нет кода передо мной, но файлы конфигурации клиента - это только те, которые живут в META-INF, правильно? Конфигурация wsit_client и дескриптор веб-службы? (Это мой первый опыт внедрения WSIT, если вы не можете сказать. Простите огромные пробелы в моих знаниях.) – rtperson