编写Xml失败。虽然它是在maven中,但找不到库

时间:2018-03-01 09:10:13

标签: java xml maven war woodstox

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

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-corejackson-dataformat-xml(和jackson-datatype-jsr310)也有依赖关系。

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

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存在于档案中。

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

2 个答案:

答案 0 :(得分:0)

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

在构建XMLInputFactory时,有一种方法可以明确指定要与Jackson XML模块一起使用的XmlMapper。通过这样做,您可以更可靠地指定要使用的工厂,而不是依赖于Stax实现的自动注册。

答案 1 :(得分: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>