2013-03-07 27 views
1

我試了兩個小時試圖從一個REST Web服務得到一個返回值,但是Netbeans產生了一個錯誤,但是我嘗試了一個錯誤。 從NetBeans中生成的代碼是REST列表<Entity>返回導致錯誤

@GET 
@Override 
@Produces({"application/xml", "application/json"}) 
public List<Person> findAll() { 
    return super.findAll(); 
} 

當我創建一個客戶我得到這個生成的代碼

public <T> T findAll_XML(Class<T> responseType) throws UniformInterfaceException { 
    WebResource resource = webResource; 
    return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType); 
} 

我已經嘗試了多種方法來調用這個並經過大量衝浪的決定這應該做的伎倆,但它沒有。

public static void main(String[] args) { 
    PersonRESTClient prc = new PersonRESTClient(); 
    Person person = prc.find_XML(Person.class, "100"); 
    System.out.println(person.getFirstname() + " " + person.getSecondname()); //THIS WORKS!! 
    GenericType<List<Person>> gType = new GenericType<List<Person>>(){}; 
    List<Person> persons = (List<Person>) prc.findAll_XML(gType.getClass()); 
    for (Person p : persons) { 
     System.out.println(person.getFirstname() + " " + person.getSecondname()); 
    } 

} 

我得到的錯誤是

2013年3月7日下午2時23分31秒com.sun.jersey.api.client.ClientResponse getEntity重度:消息正文閱讀器的Java類 restexample2client.RestExample2Client $ 1,和Java類型的類 restexample2client.RestExample2Client $ 1,和MIME媒體類型 應用程序/ XML沒有被發現2013年3月7日下午2時23分31秒 com.sun.jersey.api.client.ClientResponse getEntity嚴重: 已註冊的消息正文閱讀器組件atible與MIME媒體類型 是:應用程序/ XML - >
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider $應用
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider $ StreamSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider $ SAXSourceReader com.sun.jersey.core.impl.provider。 entity.SourceProvider $ DOMSourceReader com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider $應用
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider $應用
com.sun.jersey。 core.impl.provi der.entity.XMLRootObjectProvider $應用 / - > com.sun.jersey.core.impl.provider.entity.FormProvider com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey .core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
的com.sun。 jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider $一般 com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider $ StreamSourceReader com.sun.jersey.core.impl.provider.entity。 SourceProvider $ SAXSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider $ DOMSourceReader com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider $ General com.sun.jersey.json.impl。 provider.entity.JSONArrayProvider $一般
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider $一般
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider $一般 的com.sun。 jersey.core.impl.provider.entity.XMLListElementProvider $ General com.sun.jersey.core.impl。provider.entity.XMLRootObjectProvider $一般 com.sun.jersey.core.impl.provider.entity.EntityHolderReader
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider $一般 com.sun.jersey.json .impl.provider.entity.JSONListElementProvider $一般 com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy

異常線程 「main」 com.sun.jersey.api.client.ClientHandlerException:一消息正文 Java類class restexample2client.RestExample2Client $ 1和 Java類class restexample2client.RestExample2Client $ 1和MIME 媒體類型application/xml未在找到com.un.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:517) com.sun。 jersey.api.client.WebResource.handle(WebResource.java:684) at com.sun.jersey.api.client.WebResource.access $ 200(WebResource.java:74) at com.sun.jersey.api .client.WebResource $ Builder.get(WebResource.java:507) 在 com.carnabygaming.rest.service.client.EnterpriseRESTClient.findAll_XML(EnterpriseRESTClient.java:47) 在 restexample2client.RestExample2Client.main(RestExample2Client.java :32)

任何任何想法,我哪裏錯了? Single Object生成的代碼工作得很好。 我剛剛注意到,當我做一個測試時,該方法不會出現在網頁中。請仍需要幫助。

回答

6

是的,您需要提供接受超類型令牌(GenericType)的客戶端方法的重載變體。現在你的第二個客戶端調用是,字面上試圖反序列化響應數據,因爲類GenericType<List<Person>>,這不是你想要的。因此,首先,定義接受超標記您的客戶端上的重載方法:

public <T> T findAll_XML(GenericType<T> superType) throws UniformInterfaceException { 
    WebResource resource = webResource; 
    return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(superType); 
} 

而且在客戶端使用它作爲這樣:

GenericType<List<Person>> gType = new GenericType<List<Person>>() {}; 
List<Person> persons = (List<Person>) prc.findAll_XML(gType); 
for (Person p : persons) { 
    System.out.println(person.getFirstname() + " " 
      + person.getSecondname()); 
} 
+0

太感謝你了,這是一個100%就是我需要。我想知道爲什麼我在Netbeans站點上沒有提到這一點。再次感謝你。 – user845854 2013-03-07 17:02:06

+0

沒問題!如果答案有幫助,然後可以自由地upvote /接受它。乾杯! – Perception 2013-03-07 17:04:34