REST列表<entity>返回导致错误</entity>

时间:2013-03-07 15:43:44

标签: java web-services list rest

我已经试过了两个小时,试图让从中生成一个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)

任何有关我出错的想法?单个对象生成的代码工作得很好。 我刚刚注意到,当我进行测试时,该方法不会出现在网页中。还是需要帮助。

1 个答案:

答案 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());
}