spring java.lang.NoSuchFieldError: 反射
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25765238/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.lang.NoSuchFieldError: REFLECTION
提问by arthurfnsc
I'm creating a project with CXF and use MTOM with some security (I don't know if that information is relevant).
我正在使用 CXF 创建一个项目,并使用具有一定安全性的 MTOM(我不知道该信息是否相关)。
When I tried initialize my server I recived that error:
当我尝试初始化我的服务器时,我收到了那个错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'example': Invocation of init method failed; nested exception is java.lang.NoSuchFieldError: REFLECTION
This is my cxf-servlet.xml file:
这是我的 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>
This is my web.xml file
这是我的 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>
This is my pom.xml file:
这是我的 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>
I tried execute those two tutorials http://web-gmazza.rhcloud.com/blog/entry/cxf-usernametoken-profileand http://thenonsensetechlogs.wordpress.com/2011/05/09/mtom-using-apache-cxf-and-maven/
我尝试执行这两个教程http://web-gmazza.rhcloud.com/blog/entry/cxf-usernametoken-profile和http://thenonsensetechlogs.wordpress.com/2011/05/09/mtom-using-apache- cxf-和-maven/
回答by Innokenty
Or it could be just different versions of com.sun.xml.bind:jaxb-coreand com.sun.xml.bind:jaxb-impl. Ensure they are the same across your dependency:tree.
或者,它可能只是不同的版本com.sun.xml.bind:jaxb-core和com.sun.xml.bind:jaxb-impl。确保它们在您的dependency:tree.
I had -corev.2.2.11 and -implv.2.2.6 in my project which led to the same exception. After setting both versions to 2.2.11 via dependencyManagementsection everything became fine.
我的项目中有v.2.2.11-core和-implv.2.2.6,这导致了同样的异常。通过dependencyManagement部分将两个版本设置为 2.2.11 后,一切都变好了。
回答by Louis Querel
You have a conflict between the cxf-rt-frontend-jaxws and cxf-common-utilities libraries. Both of these provide as their dependencies com.sun.xml.bind which is the cause of your problem. So you should either exclude com.sun.xml.bind:jaxb-impl from cxf-common-utilities or remove your dependency on cxf-common-utilities.
cxf-rt-frontend-jaxws 和 cxf-common-utilities 库之间存在冲突。这两个都作为它们的依赖项 com.sun.xml.bind 提供,这是导致问题的原因。因此,您应该从 cxf-common-utilities 中排除 com.sun.xml.bind:jaxb-impl 或删除对 cxf-common-utilities 的依赖。
回答by dibs
Got the same error and found out that in my case there was a mismatch of versions of jaxb-api and jaxb-impl. The jaxb-api was included in the pom.xml with provided scope (server jboss) and the application was picking jaxb-impl from other dependency. These both were of different versions as per the stack trace.
遇到了同样的错误,发现在我的情况下,jaxb-api 和 jaxb-impl 的版本不匹配。jaxb-api 包含在具有提供范围(服务器 jboss)的 pom.xml 中,应用程序从其他依赖项中选择 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
So adding jaxb-impl in pom and marking the scope as 'provided' made sure that both has the same version and that fixed the problem.
因此,在 pom 中添加 jaxb-impl 并将范围标记为“提供”可确保两者具有相同的版本并解决了问题。

