1

我正在生成一个 Xml 文件。这适用于开发,但不适用于我的测试服务器。生成它的代码如下所示:

JacksonXmlModule xmlModule = new JacksonXmlModule();
xmlModule.setDefaultUseWrapper(false);
ObjectMapper objectMapper = new XmlMapper(xmlModule);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.writeValue(xmlFile, myObject);

我有当前版本的woodstox作为maven中的依赖项:

<dependency>
    <groupId>com.fasterxml.woodstox</groupId>
    <artifactId>woodstox-core</artifactId>
    <version>5.0.3</version>
</dependency>

jackson-core我在那里也有对and jackson-dataformat-xml(and jackson-datatype-jsr310)的依赖。

这在开发中运行良好,但是当我将代码部署为 war 文件并使用测试机器上的码头服务器启动它时,会引发此错误:

com.fasterxml.jackson.core.JsonGenerationException: Underlying Stax XMLStreamWriter 
(of type com.sun.xml.internal.stream.writers.XMLStreamWriterImpl) does not implement 
Stax2 API natively and is missing method 'writeRaw': this breaks functionality such as
indentation that relies on it. You need to upgrade to using compliant Stax implementation
like Woodstox or Aalto

我验证了war文件中确实包含库。我发现它在ROOT.war\WEB-INF\lib\woodstox-core-5.0.3.jar

所以这让我不知道为什么会出现这个错误。对我来说,似乎没有使用woodstox,因此java回退到Stax1,尽管woodstox在存档中。

有什么建议可能在这里发生或我可能做错了什么?

4

2 回答 2

0

您可能有另一个sjsxp注册的 Stax 实现(?)而不是 Woodstox。由于这是 Sun 实现,与 JDK 捆绑在一起(但至少在更早的时候作为单独的 jar 提供),这也可能意味着您实际上不包括 Woodstox。

XMLInputFactory构造XmlMapper. 通过这样做,您可以更可靠地指定要使用的工厂,而不是依赖于 Stax 实现的自动注册。

于 2018-03-02T18:23:14.467 回答
0

在您的项目中查找此依赖项(com.sun.xml.internal.stream.writers.XMLStreamWriterImpl)并从您的 pom.xml 中排除此依赖项。

例子:-

<dependency>
        <groupId>com.sun.xml</groupId>
        <artifactId>some.artifect.id</artifactId>
        <exclusions>
            <exclusion>
                <groupId>Group id of com.sun.xml.internal.stream.writers.XMLStreamWriterImpl</groupId>
                <artifactId>and artifect id</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
于 2018-08-02T11:29:42.860 回答