Je crée un projet avec CXF et j'utilise MTOM avec une certaine sécurité (je ne sais pas si ces informations sont pertinentes).
Lorsque j'ai essayé d'initialiser mon serveur, j'ai reçu cette erreur:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'example': Invocation of init method failed; nested exception is Java.lang.NoSuchFieldError: REFLECTION
Voici mon fichier cxf-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" 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">
<jaxws:endpoint
id="example"
address="/example"
implementor="br.com.arthur.services.ExampleService">
<!-- Uncomment only if using WS-SecurityPolicy -->
<jaxws:properties>
<entry key="mtom-enabled" value="true" />
<entry key="ws-security.callback-handler" value-ref="myPasswordCallback" />
</jaxws:properties>
<!-- Uncomment only if using standard WSS4J interceptors -->
<!--jaxws:inInterceptors> <bean class="org.Apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg> <map> <entry key="action" value="UsernameToken"/> <entry
key="passwordType" value="PasswordText"/> <entry key="passwordCallbackRef"
value-ref="myPasswordCallback"/> </map> </constructor-arg> </bean> </jaxws:inInterceptors -->
</jaxws:endpoint>
<bean id="myPasswordCallback" class="br.com.arthur.services.ServerPasswordCallback" />
</beans>
Ceci est mon fichier web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://Java.Sun.com/xml/ns/javaee"
xmlns:web="http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Sample web service provider</display-name>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:META-INF/cxf/cxf.xml
</param-value>
</context-param>
<servlet>
<servlet-name>WebServicePort</servlet-name>
<servlet-class>org.Apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WebServicePort</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>restricted web services</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
</web-app>
Voici mon fichier 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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.arthur</groupId>
<artifactId>security-mtom</artifactId>
<packaging>war</packaging>
<version>1.0.0</version>
<properties>
<cxf.version>3.0.1</cxf.version>
<jdk.version>1.7</jdk.version>
<maven-compiler.version>3.1</maven-compiler.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring.version>4.1.0.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-rt-core</artifactId>
<version>2.7.12</version>
</dependency>
<dependency>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-common-utilities</artifactId>
<version>2.5.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler.version}</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding></encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.basedir}/src/main/Java</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${project.basedir}/src/main/resources/wsdl/example.wsdl</wsdl>
<wsdlLocation>classpath:wsdl/example.wsdl</wsdlLocation>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2Java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
J'ai essayé d'exécuter ces deux didacticiels http://web-gmazza.rhcloud.com/blog/entry/cxf-usernametoken-profile et http://thenonsensetechlogs.wordpress.com/2011)/05/09/mtom-using-Apache-cxf-and-maven /
Vous avez un conflit entre les bibliothèques cxf-rt-frontend-jaxws et cxf-common-utilities. Ces deux fournissent leurs dépendances com.Sun.xml.bind qui est la cause de votre problème. Vous devez donc soit exclure com.Sun.xml.bind: jaxb-impl de cxf-common-utilities, soit supprimer votre dépendance à cxf-common-utilities.
Ou il peut s'agir simplement de différentes versions de com.Sun.xml.bind:jaxb-core
et com.Sun.xml.bind:jaxb-impl
. Assurez-vous qu'ils sont identiques dans votre dependency:tree
.
J'ai eu -core
v.2.2.11 et -impl
v.2.2.6 dans mon projet qui a conduit à la même exception. Après avoir défini les deux versions sur 2.2.11 via la section dependencyManagement
, tout s'est bien passé.