我已经试过了两个小时,试图让从中生成一个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:The 已注册的邮件正文阅读器与MIME媒体类型兼容 是:application / xml - &gt;
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.provider.entity.XMLRootObjectProvider $应用 / - &gt; 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 $一般 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 $一般 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:消息体 reader for class class restexample2client.RestExample2Client $ 1,and 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) 在 com.sun.jersey.api.client.WebResource.access $ 200(WebResource.java:74) 在 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)
任何有关我出错的想法?单个对象生成的代码工作得很好。 我刚刚注意到,当我进行测试时,该方法不会出现在网页中。还是需要帮助。
答案 0 :(得分: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());
}