1

我已经尝试了两个小时来尝试从生成的 REST Web 服务获取返回值,但是 Netbeans 但无论我尝试什么都会引发错误。从 netbeans 生成的代码是

@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 SEVERE:Java 类 restexample2client.RestExample2Client$1、Java 类型类 restexample2client.RestExample2Client$1 和 MIME 媒体类型应用程序的消息正文阅读器/xml 未找到 2013 年 3 月 7 日下午 2:23:31 com.sun.jersey.api.client.ClientResponse getEntity SEVERE:与 MIME 媒体类型兼容的已注册消息正文阅读器为:application/xml ->
com.sun .jersey.core.impl.provider.entity.XMLJAXBElementProvider$App
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$App
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$App
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider $App / -> 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$General 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$General
com.sun .jersey.json.impl.provider.entity.JSONObjectProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General 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$General com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy

线程“main”com.sun.jersey.api.client.ClientHandlerException 中的异常:Java 类 restexample2client.RestExample2Client$1 和 Java 类型类 restexample2client.RestExample2Client$1 和 MIME 媒体类型 application/xml 的消息正文阅读器未在com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:561) 在 com.sun.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。主要(RestExample2Client.java:32)

有人知道我哪里出错了吗?单个对象生成的代码工作得很好。我刚刚注意到,当我进行测试时,该方法不会出现在网页中。请仍然需要帮助。

4

1 回答 1

6

是的,您需要提供接受超类型标记 ( GenericType) 的客户端方法的重载变体。现在,您的第二个客户端调用实际上是在尝试将响应数据反序列化为 class 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());
}
于 2013-03-07T15:53:12.767 回答