【问题标题】:Java EE 7 Webapp - Problems with REST-Services(json) after upgrading tika-parsers to 1.11Java EE 7 Webapp - 将 tika-parsers 升级到 1.11 后出现 REST-Services(json) 问题
【发布时间】:2016-01-22 08:57:07
【问题描述】:

我有一个提供解析和搜索功能的 Java EE 7 Web 应用程序。使用 tika-parsers 1.10 时一切正常,但一旦我升级到 1.11,我的 REST-Services 读取/写入 json 失败。

    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-parsers</artifactId>
        <version>1.11</version>
    </dependency>

错误信息:

javax.ws.rs.client.ResponseProcessingException: No message body reader has been found for class de.drivve.km.idd.IddAccount, ContentType: application/json
at org.apache.cxf.jaxrs.impl.ResponseImpl.reportMessageHandlerProblem(ResponseImpl.java:433)
at org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:384)
at org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity(ResponseImpl.java:319)

我在 Wildfly 10 上运行,还有一些其他可能值得注意的依赖项:

    ...
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxb-provider</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson-provider</artifactId>
        <scope>provided</scope>
    </dependency>
    ...
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.7.0</version>
    </dependency>
    ...

似乎使用 apache-cxf(tika-parsers 需要)而不是 jackson 来读取/写入 json。知道如何解决这个问题吗?

【问题讨论】:

  • Apache CXF 是一种 JAX-RS 实现,它不能替代 Jackson。首先通过将 CXF 库的排除项添加到 tika 依赖项来进行实验(因为我几乎可以向您保证,tika 工作不需要这些依赖项);看看这是否真的让问题消失了。
  • 你是对的。我不得不排除“cxf-rt-rs-client”(其他 cxf-libraries 似乎没问题)谢谢!

标签: java json rest wildfly apache-tika


【解决方案1】:

Gimby 正确地指出了这一点。我必须添加一个排除到 tika-parser-dependency:

    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-parsers</artifactId>
        <version>1.11</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-rs-client</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

现在我的 REST-Services 再次工作和我的大部分 tika 解析测试(例如 docx、pdf、ppt、html)。 但是现在,当尝试解析 odt 文件时,tika 失败,但出现以下异常:

java.lang.NoSuchMethodError: org.apache.commons.io.IOUtils.toString(Ljava/io/InputStream;Ljava/nio/charset/Charset;)Ljava/lang/String;
at org.apache.tika.parser.pkg.ZipContainerDetector.detectOpenDocument(ZipContainerDetector.java:192)
at org.apache.tika.parser.pkg.ZipContainerDetector.detectZipFormat(ZipContainerDetector.java:145)
at org.apache.tika.parser.pkg.ZipContainerDetector.detect(ZipContainerDetector.java:90)
at org.apache.tika.detect.CompositeDetector.detect(CompositeDetector.java:77)
at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:112)
...

【讨论】:

  • 您需要能够解析这些 ODT 文件吗?如果是这样,那么这不是问题的答案,而只是将一个问题换成另一个问题的一种方式。
  • 事实上我需要能够解析 odt 文件。不知道为什么需要 cxf-rt-rs-client 。是否可以“配置不使用 cxf”作为消息体读取器/写入器而不排除任何 tika-parser 依赖项?
  • 这是一个困难的。我假设 CXF 依赖项正在传递另一个 JSON 处理程序 API,并且您自己的 JAX-RS 实现(Jersey?RestEASY?)正在自动选择它。因此,您需要在 JAX-RS 实现的文档中查找如何手动配置一个以始终使用。
  • 因此,如果我们同意这实际上不是您问题的答案,我会删除它。而是将相关信息编辑到您的问题中。
  • 实际上排除 cxf 是/不是那么糟糕,因为它解决了缺少的 messageBodyReader 并指出了干扰的内容。仍然在我的情况下,我需要找到另一个解决方案。顺便说一句,我正在使用 RestEASY。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2021-02-20
  • 2020-03-07
  • 1970-01-01
相关资源
最近更新 更多