CXF 2.7.x Woodstox Compatibility via Maven
在 CXF 的文档中说 2.7.x 版本要求不在 4.2.0 版本下的 Woodstox jar 在类路径中可用。
有人可以建议 Woodstox 与 CXF 一起使用的 Maven 依赖项吗?
主要问题是当我尝试使用 cxf\\ 的客户端时,会引发异常 "Cannot create a secure XMLInputFactory"。根据不同的论坛(例如),可以使用"org.apache.cxf.stax.allowInsecureParser"系统属性来解决问题,但这似乎不是一个好方法。所以maven依赖是要走的路...
提前致谢。
好吧,我终于找到了解决方案。首先,我要感谢 StaxMan 的帮助。
我的环境是:
Weblogic 11g,CXF 2.7.5
问题是 WLS 已经包含 StAX API 和 xml 解析器的实现,这就是为什么应用程序在使用 CXF 时看不到 Woodstox 解析器。
这里是 pom.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <!-- CXF --> <dependency> <groupId>org.apache.cxf</groupId> cxf-api</artifactId> </dependency> <dependency> <groupId>org.apache.cxf</groupId> cxf-rt-frontend-jaxws</artifactId> </dependency> <dependency> <groupId>org.apache.cxf</groupId> cxf-rt-transports-http</artifactId> </dependency> |
和主要部分——weblogic-application.xml 位于 resources/META-INF/ :
1 2 3 4 | [cc lang="java"] <package-name>com.ctc.wstx.*</package-name> <package-name>org.apache.*</package-name> </prefer-application-packages> |
请注意,如果这样做可能会出现"NoClassDefinition"错误。如果是这样,请添加包含缺失类的 Maven 依赖项。
希望这对某人有所帮助。
在没有 prefer-application-packages impl 的情况下,这对我有用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <dependency> <groupId>org.apache.cxf</groupId> cxf-rt-frontend-jaxws</artifactId> <version>${cxf.version}</version> <exclusions> <exclusion> <groupId>com.sun.xml.bind</groupId> jaxb-impl</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> jaxb-impl</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> cxf-rt-transports-http</artifactId> <version>${cxf.version}</version> </dependency> <!-- Jetty is needed if you're using the CXFServlet --> <dependency> <groupId>org.apache.cxf</groupId> cxf-rt-transports-http-jetty</artifactId> <version>${cxf.version}</version> </dependency> |
目前我可以解决问题的唯一方法是在 spring 的上下文中添加这样的行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject"> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetClass" value="java.lang.System" /> <property name="targetMethod" value="getProperties" /> </bean> </property> <property name="targetMethod" value="putAll" /> <property name="arguments"> <util:properties> <prop key="org.apache.cxf.stax.allowInsecureParser">true</prop> </util:properties> </property> </bean> |