【问题标题】:Jersey message body reader not found in maven-built JAR在 Maven 构建的 JAR 中找不到泽西消息正文阅读器
【发布时间】:2011-02-13 09:46:52
【问题描述】:

我的应用程序使用 REST (JAX-RS Jersey) 接口。当我在 Eclipse 中运行它时,一切都' 很好。域对象已注释,我没有使用 XML 文件进行 REST 映射。

现在我使用 maven-assembly-plugin 创建了一个独立的 JAR,它将应用程序和所有依赖项打包在一个可执行的 JAR 文件中。这似乎也有效。

但是当我启动应用程序并从服务器请求一个对象时,Jersey 抱怨说它找不到消息正文阅读器:

com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java type, class de.rybu.atuin.core.entity.User, and MIME media type, application/json, was not found

你知道为什么会这样吗?

编辑:在我睡了一晚之后,我注意到它抱怨 JSON……但我只使用 XML 进行序列化。奇怪。

【问题讨论】:

  • this thread 有帮助吗?如果没有,也许添加一些关于你的代码的细节,用户类......

标签: java rest jax-rs executable-jar maven-assembly-plugin


【解决方案1】:

我正在使用 Jersey Client 1,为了解决这个问题,我创建了一个通用的 json 消息正文阅读器。

public class JSONMessageBodyReader<T> implements MessageBodyReader<T> {

@Override
public boolean isReadable(Class<?> arg0, Type arg1, Annotation[] arg2,
        MediaType arg3) {
    return true;
}

@SuppressWarnings("unchecked")
@Override
public T readFrom(Class<T> clazz, Type type, Annotation[] arg2,
        MediaType arg3, MultivaluedMap<String, String> arg4,
        InputStream is) throws IOException, WebApplicationException {

    byte[] bytes = new byte[is.available()];
    is.read(bytes);
    String json = new String(bytes, "UTF-8");

    ObjectMapper mapper = new ObjectMapper();
    mapper.readValue(json, TypeFactory.defaultInstance().constructType(type));

    return (T) mapper.readValue(json, TypeFactory.defaultInstance().constructType(type));

}

}

【讨论】:

    【解决方案2】:

    我遇到了同样的问题 (http://goo.gl/Mk9sZ)。它通过将 jersey-multipart jar 的 maven 依赖项从 1.0.2 更改为 1.8 版本来解决(在客户端和提供程序端使用相同的依赖项。

                 <dependency>
                    <groupId>com.sun.jersey.contribs</groupId>
                    <artifactId>jersey-multipart</artifactId>
                    <version>1.8</version>
                 </dependency>
    

    你可以在http://goo.gl/Mk9sZ找到我使用的完整代码

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,在 stackoverflow 上搜索,我发现像this solution 建议的那样将 jersery-json-1.x.jar 添加到 WEB-INF/lib 将解决问题。 请给Mikhail打赏!

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题(从 Eclipse 运行正常或部署为单独的 jar,但不是从可执行 jar 部署),发现使用 maven 依赖插件和 maven jar 插件创建可执行 jar 的 this approach 工作正常。这是因为它将依赖项放在单独的 lib 目录中,然后将其包含在清单的类路径中,而不是将它们全部合并在一起,这可能会导致许多问题。

        【讨论】:

          【解决方案5】:

          我解决了这个问题,我想我知道怎么做:-)

          我的资源是这样注释的:

          @Produces( { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
          @Path(CONTEXT_ADDRESS)
          public class UserResource
          {
          }
          

          我的客户使用了相反的顺序:

          WebResource wr = ...
          User user = wr.accept(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_XML_TYPE).get(new GenericType<User>(){});
          

          我不知道最初是什么导致了问题,但我完全删除了 JSON 支持,现在它可以工作了。也许在客户端中简单地切换 JSON 和 XML 的顺序就足够了,但我没有尝试。

          【讨论】:

            猜你喜欢
            • 2012-01-25
            • 2014-06-05
            • 1970-01-01
            • 1970-01-01
            • 2015-06-04
            • 1970-01-01
            • 1970-01-01
            • 2016-04-03
            相关资源
            最近更新 更多