2014-09-10 10 views
19

Tworzę projekt z CXF i używam MTOM z pewnymi zabezpieczeniami (nie wiem, czy te informacje są istotne).java.lang.NoSuchFieldError: REFLECTION

Kiedy próbowałem zainicjować mój serwer I otrzymało ten błąd:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'example': Invocation of init method failed; nested exception is java.lang.NoSuchFieldError: REFLECTION 

To jest mój plik 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> 

To jest mój plik 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> 

To jest mój plik 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> 

Próbowałem wykonać te dwa tutoriale http://web-gmazza.rhcloud.com/blog/entry/cxf-usernametoken-profile i http://thenonsensetechlogs.wordpress.com/2011/05/09/mtom-using-apache-cxf-and-maven/

+0

Co jest w twoim 'cxf.xml'? Pytam, ponieważ podałeś 'cxf-servlet.xml' powyżej, ale w twoim' web.xml' odnosi się to do 'cxf.xml' – Ascalonian

Odpowiedz

27

Masz konflikt między CXF-RT-frontend-JAXWS i CXF-common-utilities bibliotek. Oba zapewniają jako zależności com.sun.xml.bind, co jest przyczyną twojego problemu. Powinieneś więc wykluczyć com.sun.xml.bind: jaxb-impl z cxf-common-utilities lub usunąć zależność od cxf-common-utilities.

34

Lub może to być po prostu różne wersje com.sun.xml.bind:jaxb-core i com.sun.xml.bind:jaxb-impl. Upewnij się, że są takie same na całym Twoim dependency:tree.

Posiadałem -core v.2.2.11 i -impl v.2.2.6 w moim projekcie, który doprowadził do tego samego wyjątku. Po ustawieniu obu wersji na 2.2.11 przez dependencyManagement wszystko stało się w porządku.

Powiązane problemy