2014-07-02 23 views
8

versuchen, die cxf + wss4j mit Maven zu verwenden. Erstellt den Dienst und den Client ohne irgendwelche Kompilierungsprobleme. Der Service läuft gut in Tomcat.
Ausgabe: Wenn ich den Client-Code ausführen, ich bekommen "java.lang.NoSuchMethodError: org.apache.xml.security.utils.I18n.init (Ljava/util/Resource;) V". Diese Klasse befindet sich in xmlsec jar, die mit der cxf-Distribution geliefert wird.cxf + wss4j + maven NoSuchMethod error

pom.xml für Service-Projekt:

<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>WebContent\WEB-INF\web.xml</webXml> 
        </configuration> 
       </plugin> 
      </plugins> 
     </pluginManagement> 
    </build> 
</project> 


pom.xml für Client-Projekt

<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> 

Edit: WSS4J Mit Benutzernamen Token versuchen, Client-Code :

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()); 
    } 

Client WSS4J config:

<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> 

Service WSS4J config:

<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> 

Antwort

8

CXF 3.0.0 nicht mit WSS4J 1.6.15 arbeiten. Sie müssen stattdessen WSS4J 2.0.0 verwenden.

Colm.

+0

versucht ohne Maven - zurück zu Cxf 2.7.7 verschoben. Vom Client entfernt xmlsec.jar und im Server verwendet xmlsec.jar 1.3.0. & wss4j 1.6.15 in Client und Service, jetzt funktioniert es gut. –

+2

WSS4J 2.x scheint kein Maven Artefakt zu sein. Es gibt eine Zip-Datei, aber die Verwendung von normalen Groß-/Kleinschreibung-Typen scheint derzeit nicht zu funktionieren, um die Quelle zu erhalten und den Code lokal zu erstellen. Werden WSS4J 2.x-Gläser irgendwo anders auf der Welt gehostet? – Christian

+0

Ich bin auch in W44S4J 2.x Gläser interessiert ... Jeder? –

4

Ich hatte auch das gleiche Problem. Beschlossen durch die Abhängigkeit "WSS4J-WS-Security-common-2.0.3.jar"

auf WSS4J Für weitere Einzelheiten mit 2.0.0 Migration, pl siehe "http://ws.apache.org/wss4j/migration/wss4j20.html"

+0

Wie würde man diese Abhängigkeit in einem IntelliJ-Projekt hinzufügen? –

+0

https://mvnrepository.com/artifact/org.apache.wss4j/wss4j/2.1.7 – Nacho

+0

Vielen Dank. Wir haben es gelöst mit 'org.apache.wss4j.common.ext.WSPasswordCallback pc = (org.apache.wss4j.common.ext.WSPasswordCallback) Rückrufe [0]; pc.setPassword (Passwort); ' Wir mussten wegen einiger Abhängigkeit wss4j-1.6.19.jar verwenden. Die obige Klasse stammt aus wss4j-ws-security-common-2.1.5.jar – Vins

0

Wenn Sie die WSS4J Abhängigkeit hinzufügen sicherstellen, dass Sie es als pom Typ hinzufügen, da Sie sonst einen Fehler haben. Diese sould die Abhängigkeit in Ihrem pom

<dependency> 
     <groupId>org.apache.wss4j</groupId> 
     <artifactId>wss4j</artifactId> 
     <version>2.1.7</version> 
     <type>pom</type> 
    </dependency> 

Auch stellen Sie sicher sein, das Maven zentralen Repository angeben, damit sie es sicher finden:

es
<repositories> 
     <repository> 
      <id>central</id> 
      <url>http://central.maven.org/maven2/</url> 
      <releases> 
       <enabled>true</enabled> 
      </releases> 
     </repository> 
    </repositories> 

Das ist.