【问题标题】:java.lang.NoSuchFieldError: REFLECTIONjava.lang.NoSuchFieldError:反射
【发布时间】:2014-11-04 02:12:02
【问题描述】:

我正在使用 CXF 创建一个项目并使用具有一定安全性的 MTOM(我不知道该信息是否相关)。

当我尝试初始化我的服务器时,我收到了这个错误:

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

这是我的 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>

这是我的 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>

这是我的 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>

我尝试执行这两个教程http://web-gmazza.rhcloud.com/blog/entry/cxf-usernametoken-profilehttp://thenonsensetechlogs.wordpress.com/2011/05/09/mtom-using-apache-cxf-and-maven/

【问题讨论】:

  • 您的cxf.xml 中有什么内容?我问是因为您在上面提供了cxf-servlet.xml,但在您的web.xml 中它指的是cxf.xml

标签: spring maven cxf mtom


【解决方案1】:

运行mvn dependency:tree后排除依赖

<exclusions>
  <exclusion>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
  </exclusion>
</exclusions>

【讨论】:

    【解决方案2】:

    遇到同样的错误,发现在我的情况下,jaxb-api 和 jaxb-impl 的版本不匹配。 jaxb-api 包含在 pom.xml 中,具有提供的范围(服务器 jboss),并且应用程序正在从其他依赖项中选择 jaxb-impl。根据堆栈跟踪,它们都是不同的版本。

    Servlet.service() for servlet Spring MVC Servlet threw exception: java.lang.NoSuchFieldError: REFLECTION[0m
        [Server:ODIN64_Server01] [31m             at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.<init>(RuntimeModelBuilder.java:87) [**jaxb-impl-2.1.7.jar:2.1.7**][0m
        .....
        [Server:ODIN64_Server01] [31m             at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:211) **[jboss-jaxb-api_2.2_spec-1.0.4.Final-redhat-3.jar:1.0.4.Final-redhat-3**][0m
    

    因此在 pom 中添加 jaxb-impl 并将范围标记为“已提供”确保两者具有相同的版本并解决了问题。

    【讨论】:

      【解决方案3】:

      或者它可能只是 com.sun.xml.bind:jaxb-corecom.sun.xml.bind:jaxb-impl 的不同版本。确保它们在您的 dependency:tree 中相同。

      我的项目中有-core v.2.2.11 和-impl v.2.2.6,这导致了同样的异常。通过dependencyManagement 部分将两个版本都设置为 2.2.11 后,一切都变好了。

      【讨论】:

      • 我正在使用 Maven 并没有更改 pom.xml 中的任何内容,但仍然出现此错误。我认为这是因为一旦我使用与平常不同的 JDK 主目录运行 mvn install,就会在 /target.../WEB-INF/lib 目录中安装不同的 -impl 和 -core jar。恢复使用以前的 JDK 主目录后,我复制了 -impl 和 -core jars。如果您遇到类似情况,那么解决此问题的简单方法是从 /target.../WEB-INF/lib 删除错误版本的 -impl 和 -core 或运行 mvn clean install
      • 就我而言,我有几个传递依赖项,这引发了开头提到的异常。为了摆脱它,我使用了 POM-Editor 的 Dependency Hierarchy 页面,发现我的 -core-impl 的版本不匹配。排除一个后,它开始按预期工作。
      【解决方案4】:

      cxf-rt-frontend-jaxws 和 cxf-common-utilities 库之间存在冲突。这两个都提供了 com.sun.xml.bind 作为它们的依赖项,这是导致您的问题的原因。因此,您应该从 cxf-common-utilities 中排除 com.sun.xml.bind:jaxb-impl 或删除对 cxf-common-utilities 的依赖。

      【讨论】:

        猜你喜欢
        • 2020-11-04
        • 2015-10-10
        • 2013-06-05
        • 2013-01-04
        • 2020-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多