2010-04-28 46 views
5

我的应用程序使用REST(JAX-RS Jersey)接口。当我在Eclipse中运行它时,一切' 很好。域对象是注释的,我没有使用REST映射的XML文件。在Maven构建的JAR中找不到Jersey邮件正文阅读器

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

但是当我启动应用程序并从服务器请求一个对象,泽西抱怨,它无法找到邮件正文的读者:

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进行序列化。奇怪。

+0

不[此线索](http://markmail.org /线程/ ugx2cku6bsj3g35v)的帮助?如果没有,可以添加一些关于你的代码,用户类的细节...... – 2010-04-28 15:28:02

回答

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

1

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

3

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

1

我面临同样的问题(http://goo.gl/Mk9sZ)。它得到了改变行家依赖于新泽西州的多罐子从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使用的完整代码

0

我使用Jersey客户端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)); 

} 

}

相关问题