关于 java:CXF 2.7.x Woodstox Compatibility via Maven

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>