2012-05-16 65 views
3

我正在使用澤西島1.1(舊,我知道 - 必須因爲我與Java 1.5卡住)。我正在做一個簡單的GET,其中一個Java對象作爲實體返回。 Java對象正在被正確編組(Java到XML),因爲我可以通過Web發出GET請求,並且它工作得很好。我正在嘗試使用Jersey客戶端發出GET請求並將它解組回Java對象,這就是它失敗的地方。不應該知道如何將它從GET請求收到的XML解組到POJO中,因爲它的註釋是正確的?它在服務器端工作。這裏的例外,我得到:澤西島Java客戶端消息正文閱讀器未找到Java類型

ClientHandlerException: A message body reader for Java type, class my.class.SearchResult, and MIME media type, application/xml was not found. 

這裏的客戶端代碼:

private SearchResult search() { 
    WebResource wr = new Client().resource("http://localhost:8080/MyProject/search"); 
    return wr.get(SearchResult.class); 
} 

這裏的JAXB註釋的POJO我使用的客戶端和服務器上:

@XmlRootElement(name = "searchResults") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "searchResults", propOrder = { 
    "results" 
}) 
public class SearchResult { 
    @XmlElement(name = "result") 
    private List<Result> results = new ArrayList<Result>(); 

    public List<Result> getResults() { 
     return results; 
    } 
    ... 
} 

這裏的內結果也是POJO:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "resultType", propOrder = { 
    "name", 
    "version", 
    "type" 
}) 
public class Result { 
    private String name; 
    private String version; 
    private String type; 
    ... 
} 

以下是GET服務本身:

@Path("/search") 
public class SearchRest { 
    @GET 
    @Produces(MediaType.APPLICATION_XML) 
    public SearchResult search() { 
     SearchResult result = new SearchResult(); 
     .... 
     return result; 
    } 
} 

謝謝!

+0

你可以提供你的'Result'類嗎? –

+0

我編輯了結果類的帖子 – billsfan80

+0

可能自己找到了解決方案。我認爲把jaxb罐放在我的classpath中解決了它。我沒有收到任何錯誤表明他們不在那裏,但我的猜測是@XmlRootElement註釋在運行時被忽略,因爲我的類路徑中沒有jaxb jar。對此有何想法? – billsfan80

回答

3

我通過將JAXB jar添加到客戶端的類路徑中解決了該問題。我不知道爲什麼這解決了這個問題,但我猜想這是因爲我的POJO中的@XmlRootElement和其他JAXB註釋在運行時被忽略,因爲這些jar不存在。這導致Jersey未檢測到註釋,因此認爲它無法在客戶端的xml和POJO之間進行翻譯。當我嘗試了另一種避免需要註釋的方法時,我發現瞭解決方案,即將根POJO包裝到JAXBElement中。我更新了Web服務類以生成JAXBElement,並更新了客戶端以期望得到相同的結果。然後我得到了一個N​​oClassDefFoundError,它更能指示缺少的jar,因爲我直接引用了JAXBElement。我想我很幸運。

3

@XmlRootElement註釋添加到您的Result類。

+2

看到我上面的評論,我想我已經解決了。但至於你的建議,爲什麼我會指出結果是根本因素。我怎麼能有兩個根元素? SearchResult類已被註釋爲根。它包含一個Result對象列表。 – billsfan80

相關問題