WSIT, Maven и wsimport - могут ли они работать вместе? - PullRequest
6 голосов
/ 24 марта 2010

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

1 Ответ

2 голосов
/ 24 марта 2010

Разве вы не должны предоставить клиентские файлы конфигурации WSIT для клиента? Что вы ожидаете от wsimport точно?

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...