#maven-2 #jax-ws #cxf #wss4j #xmlsec
#maven-2 #jax-ws #cxf #wss4j #xmlsec
Вопрос:
пытаюсь использовать cxf wss4j с помощью maven. Созданы как служба, так и клиент без каких-либо проблем с компиляцией. Служба работает нормально в tomcat.
Проблема: при запуске клиентского кода я получаю «java.lang.Ошибка noSuchMethod: org.apache.xml.security.utils.I18n.init(Ljava/util/ResourceBundle;)V». Этот класс находится в xmlsec jar, который поставляется вместе с дистрибутивом cxf.
pom.xml для сервисного проекта:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>userNameTokenService</groupId>
<artifactId>userNameTokenService</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
<version>1.6.15</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>WebContentWEB-INFweb.xml</webXml>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
pom.xml для клиентского проекта
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>userNameTokenClient</groupId>
<artifactId>userNameTokenClient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
<version>1.6.15</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>src</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Редактировать:
Использование wss4j для проверки токена имени пользователя, клиентского кода:
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
HelloWorld helloworld= (HelloWorld) context.getBean("helloClient");
HelloRequest hreq = new HelloRequest();
hreq.setRequestMsg("This is client");
HelloResponse hres = helloworld.sayHello(hreq);
System.out.println(hres.getResponseMsg());
}
конфигурация клиента wss4j:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<bean id="logInBound" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="logOutBound" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
<jaxws:client id="helloClient" serviceClass="com.ddmwsst.helloworld.HelloWorld"
address="http://localhost:8080/userNameTokenService/services/HelloWorld">
<jaxws:inInterceptors>
<ref bean="logInBound" />
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<ref bean="logOutBound" />
<ref bean="outbound-security" />
</jaxws:outInterceptors>
</jaxws:client>
<!-- WSS4JOutInterceptor for incorporating a UsernameToken in a SOAP -->
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"
id="outbound-security">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="user" value="dummy" />
<!--entry key="passwordType" value="PasswordText"/ -->
<entry key="passwordCallbackClass" value="client.ClientPasswordCallback" />
</map>
</constructor-arg>
</bean>
</beans>
конфигурация службы wss4j:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<bean id="logInBound" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="logOutBound" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
<!-- WSS4JInInterceptor for processing a UsernameToken from the SOAP -->
<bean id="inbound-security" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<!--entry key="passwordType" value="PasswordText"/ -->
<entry key="passwordCallbackClass" value="server.ServerPasswordCallback" />
</map>
</constructor-arg>
</bean>
<jaxws:endpoint id="helloWorld" implementor="server.HelloWorldImpl"
address="/HelloWorld">
<jaxws:inInterceptors>
<ref bean="logInBound" />
<ref bean="inbound-security" />
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<ref bean="logOutBound" />
</jaxws:outInterceptors>
</jaxws:endpoint>
</beans>
Ответ №1:
CXF 3.0.0 не работает с WSS4J 1.6.15. Вместо этого вам нужно использовать WSS4J 2.0.0.
Colm.
Комментарии:
1. пробовал без maven — вернулся к cxf 2.7.7. Из клиента удален xmlsec.jar и на используемом сервере xmlsec.jar 1.3.0. amp; wss4j 1.6.15 как в клиенте, так и в службе, теперь все работает нормально.
2. WSS4J 2.x, похоже, не является артефактом jar в maven. Существует zip-файл, но использование обычного типа gradle / pom includes, похоже, в настоящее время не работает, если не считать получения исходного кода и локальной сборки кода. Размещены ли банки WSS4J 2.x где-нибудь еще в мире?
3. Меня также интересуют банки W44S4J 2.x … Кто-нибудь?
Ответ №2:
У меня тоже была такая же проблема. Она устранена с помощью зависимости «wss4j-ws-security-common-2.0.3.jar «
Более подробную информацию о миграции wss4j 2.0.0 см. в разделе «http://ws.apache.org/wss4j/migration/wss4j20.html«
Комментарии:
1. Как можно было бы добавить эту зависимость в проект IntelliJ?
2. Спасибо. Мы решили ее с помощью ‘org.apache.wss4j.common.ext. WSPasswordCallback pc = (org.apache.wss4j.common.ext. Обратные вызовы WSPasswordCallback)[0]; pc.SetPassword (пароль);’ Нам пришлось использовать wss4j-1.6.19.jar из-за некоторой зависимости. Вышеупомянутый класс из wss4j-ws-security-common-2.1.5.jar
Ответ №3:
Возникла точно такая же проблема. В моем случае обновление до wss4j 2.x.x не помогло. У меня было 2 перекрывающихся зависимости, и как только я удалил избыточную wss4j одну и полагался только на spring-ws-security, все прошло нормально. Главное — использовать spring-ws-security 3.x.x, а не 2.x.x. Проблема была описана здесь:https://jira.spring.io/browse/SWS-970
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-security</artifactId>
<version>3.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
<version>1.6.15</version>
Ответ №4:
У меня была похожая проблема. Это произошло из-за того, что maven ввел несколько версий xmlsec. Она была устранена путем установки последней версии на верхнем уровне. На момент написания:
<dependency>
<groupId>org.apache.santuario</groupId>
<artifactId>xmlsec</artifactId>
<version>2.2.0</version>
</dependency>
Ответ №5:
Вы можете найти wss4j в другом groupid в maven:
https://mvnrepository.com/artifact/org.apache.wss4j/wss4j/2.1.7
Ответ №6:
При добавлении зависимости wss4j убедитесь, что вы добавили ее как тип pom, иначе у вас будет ошибка. Это может быть зависимость в вашем pom
<dependency>
<groupId>org.apache.wss4j</groupId>
<artifactId>wss4j</artifactId>
<version>2.1.7</version>
<type>pom</type>
</dependency>
Также обязательно укажите центральный репозиторий maven, чтобы он мог точно его найти:
<repositories>
<repository>
<id>central</id>
<url>http://central.maven.org/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
Вот и все.