Java 在android上使用jackson数据格式xml

Java 在android上使用jackson数据格式xml,java,android,jaxb,jackson,jackson-modules,Java,Android,Jaxb,Jackson,Jackson Modules,我正在android上努力使用jackson dataformat xml 我有一些在oracle jre上运行良好的非常基本的代码 JacksonXmlModule module = new JacksonXmlModule(); module.setDefaultUseWrapper(false); XmlMapper xmlMapper = new XmlMapper(module); 首先,我尝试为gradle改编(我自己,不确定是否正确): 结果:gradle未能在构建时将corel

我正在android上努力使用jackson dataformat xml

我有一些在oracle jre上运行良好的非常基本的代码

JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);
首先,我尝试为gradle改编(我自己,不确定是否正确):

结果:gradle未能在构建时将corelibraries绑定到应用程序中

...
:app:preDexDebug
trouble processing "javax/xml/stream/EventFilter.class":
Ill-advised or mistaken usage of a core class (java.* or javax.*)
when not building a core library.
...
第二次尝试追随肖恩的脚步 (基本上,他用前缀名称重新打包corelibs,并重建jackson数据格式xml以使用前缀名称)

并且在重复项上生成时间失败

Duplicate files copied in APK META-INF/services/com.fasterxml.jackson.core.ObjectCodec
补充如下:

packagingOptions {
    ...
    exclude 'META-INF/services/com.fasterxml.jackson.core.JsonFactory'
    exclude 'META-INF/services/com.fasterxml.jackson.core.ObjectCodec'
}
当添加它构建和部署的排除项时,但在stackdump下运行时失败(据我所知,即使它被添加到类路径中,它也找不到SAX提供程序)

edu.usf.cutr.javax.xml.stream.FactoryConfigurationError:找不到提供程序com.bea.xml.stream.MXParserFactory
位于edu.usf.cutr.javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:72)
位于edu.usf.cutr.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:176)
位于edu.usf.cutr.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:92)
位于edu.usf.cutr.javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:136)
位于com.fasterxml.jackson.dataformat.xml.XmlFactory.(XmlFactory.java:97)
位于com.fasterxml.jackson.dataformat.xml.XmlFactory.(XmlFactory.java:85)
位于com.fasterxml.jackson.dataformat.xml.XmlFactory.(XmlFactory.java:82)
位于com.fasterxml.jackson.dataformat.xml.XmlMapper。(XmlMapper.java:46)

在#1或#2上前进的正确方法是什么?

第2条是正确的方法(Android不喜欢在正式Java包名称空间中包含类,但我还是写了原始答案,所以我有偏见)

我认为
FactoryConfigurationError:Provider com.bea.xml.stream.MXParserFactory未找到
错误是由于以下原因造成的。在早期版本的ADT for Eclipse和Gradle插件<0.7.0中,
/META-INF/*
文件在构建过程中从JAR中剥离。根据谷歌的说法,似乎>=v0.7.0不应该有这个问题,但从其他人的报告来看,它似乎仍然有问题,可能会删除平台注册Aalto所需的
META-INF/services/javax.xml.stream.XMLInputFactory
文件

尝试以下中提到的解决方法:

  • 右键单击/src/main(其中有/java和/res文件夹)
  • 选择新建>文件夹>Java资源文件夹
  • 单击完成(不更改文件夹位置)
  • 右键单击新建/资源文件夹
  • 选择新建>目录
  • 输入“META-INF”(不带引号)
  • 右键单击
    /resources/META-INF
    文件夹
  • 选择新建>目录
  • 输入“服务”(不带引号)
  • 将您需要的任何文件复制到
    /resources/META-INF/services
  • 对于您来说,在上面的步骤10中,您需要复制到
    /resources/META-INF/services
    。如果将来文件链接中断,文件名为
    javax.xml.stream.XMLInputFactory
    ,它由一行组成:

    com.fasterxml.aalto.stax.InputFactoryImpl

    编辑

    如果您收到“错误:打包APK时文件重复…存档中的路径:META-INF/services/javax.xml.stream.XMLInputFactory”,您可以尝试告诉Gradle保留第一次出现的错误,方法是:

    android {
      packagingOptions {
        pickFirst 'META-INF/services/javax.xml.stream.XMLInputFactory'
      }
    }
    
    编辑2


    可能会影响“pickFirst”。请确保您运行的是最新版本的Android Studio,并更新您的本地工具和Android Gradle插件,以确保您运行的是最新版本的工具。这可能已在中修复。

    我已尝试向jackson xml添加XmlPull支持。在此处找到分叉项目:

    目前,仅支持版本2.9.6。(克隆分支jackson-dataformat-xml-2.9.6-XmlPull)


    很抱歉,由于时间限制,我无法提供详细的文档。如果您了解git和maven来拉取一个特定的分支并构建jar,那么它应该相对容易。

    对于将来需要它的人: 首先,按照Android应用程序的说明将Jitpack集成到您的Android应用程序中:

    然后将jackson dataformat xml的GitHub url粘贴到Jitpack站点的相应文本框中。GitHub url为: .
    就这样!享受结果。:)

    仅供参考-我对我的第一个答案做了一些修改。我在另一个问题上解决了同样的(?)问题-。老兄,你太棒了。谢谢。从现在起这个问题有什么更新吗?我尝试了这些步骤,但对解决问题没有帮助issue@anber您得到的堆栈跟踪与本问题中的完全相同吗?是的,完全相同的堆栈跟踪。也许类似的事情可以帮助-?AOSP问题仍然悬而未决-。我想这就是问题所在——请开始吧。修复后,它可能会正常工作。
    packagingOptions {
        ...
        exclude 'META-INF/services/com.fasterxml.jackson.core.JsonFactory'
        exclude 'META-INF/services/com.fasterxml.jackson.core.ObjectCodec'
    }
    
    edu.usf.cutr.javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.MXParserFactory not found
                at edu.usf.cutr.javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:72)
                at edu.usf.cutr.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:176)
                at edu.usf.cutr.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:92)
                at edu.usf.cutr.javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:136)
                at com.fasterxml.jackson.dataformat.xml.XmlFactory.<init>(XmlFactory.java:97)
                at com.fasterxml.jackson.dataformat.xml.XmlFactory.<init>(XmlFactory.java:85)
                at com.fasterxml.jackson.dataformat.xml.XmlFactory.<init>(XmlFactory.java:82)
                at com.fasterxml.jackson.dataformat.xml.XmlMapper.<init>(XmlMapper.java:46)
    
    android {
      packagingOptions {
        pickFirst 'META-INF/services/javax.xml.stream.XMLInputFactory'
      }
    }