我正在生成一个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-core
和jackson-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存在于档案中。
有什么建议可以在这里发生,或者我可能做错了什么?
答案 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>