2010-04-28 43 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)); 

} 

}

相關問題