2010-03-24 6 views
6

Я работаю над небольшим и многомодульным проектом в 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 правильно настроить.

ответ

2

Возможно, вы не указали Клиентские файлы конфигурации WSIT для клиента? Что вы ожидаете от wsimport точно?

Edit: Как подразумеваемые, тем WSIT документ describes два файла на стороне клиента конфигурации: wsit-client.xml и {wsdl file name}.xml и:

При запуске клиента, эти файлы должны быть в пути к классам, либо в (например, build/classes) или в каталоге META-INF под корнем classpath.

транспонированного к проекту Maven, естественное место для этих файлов будет src/main/resources или src/main/resources/META-INF папку. Лично я предпочитаю помещать их в META-INF.

+0

«Просто» частью этого является трюк. Сегодня я проделал большую работу, и после учебного курса WSIT я смог получить NetBeans для создания безопасного WS Client. Мне все еще не удалось заставить мой проект Maven играть счастливо с настройкой, но я рядом. Это мой первый безопасный веб-сервис, поэтому я учусь, когда я иду. Я, вероятно, отправлю свой собственный ответ в виде мини-учебника о том, как я это сделал, чтобы другие могли избежать некоторой боли, которую я пережил. Благодаря! – rtperson

+0

@rtperson Я не говорю, что WSIT тривиален, но я все еще не понимаю, что вы ожидаете во время wsimport. AFAIK, предоставляя файлы конфигурации WSIT на стороне клиента, не влияет на генерацию клиентских артефактов. –

+0

Паскаль, теперь, когда я видел, как фигуры подходят друг к другу, я знаю, что wsimport не будет делать ничего другого, чем сейчас, поэтому мне удалось пройти мимо этого. Но я еще не смог создать безопасный клиент WSIT через Maven. Я сейчас дома, и у меня нет кода передо мной, но файлы конфигурации клиента - это только те, которые живут в META-INF, правильно? Конфигурация wsit_client и дескриптор веб-службы? (Это мой первый опыт внедрения WSIT, если вы не можете сказать. Простите огромные пробелы в моих знаниях.) – rtperson

Смежные вопросы