在maven-build JAR中找不到Jersey消息体阅读器

时间:2010-04-28 14:57:45

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

我的应用程序使用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进行序列化。奇怪。

5 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,在stackoverflow上搜索,我发现将jersey-json-1.x.jar添加到WEB-INF / lib中就像this solution所建议的那样解决了这个问题。 请奖励Mikhail

答案 1 :(得分:1)

我解决了问题,我想我知道如何: - )

我的资源注释如下:

@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的顺序就足够了,但我没有尝试过。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我遇到了同样的问题(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

找到我使用的完整代码

答案 4 :(得分:0)

我正在使用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));

}

}