web-dev-qa-db-fra.com

java.lang.NoSuchFieldError: REFLECTION

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 /

21
arthurfnsc

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.

35
Louis Querel

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

44
Innokenty