【问题标题】:REST List<Entity> return causing errorsREST List<Entity> 返回导致错误
【发布时间】:2013-03-07 23:53:12
【问题描述】:

我已经尝试了两个小时来尝试从生成的 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 媒体类型兼容的注册消息正文阅读器 是:应用程序/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$General 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 媒体类型应用程序/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)

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

【问题讨论】:

    标签: java web-services list rest


    【解决方案1】:

    是的,您需要提供接受超类型令牌 (GenericType) 的客户端方法的重载变体。现在您的第二个客户端调用字面意思试图将响应数据反序列化为GenericType&lt;List&lt;Person&gt;&gt; 类,这不是您想要的。因此,首先,在您的客户端上定义一个接受超类型令牌的重载方法:

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

    【讨论】:

    • 非常感谢,这是我 100% 需要的。我想知道为什么我在 Netbeans 网站上没有提到这一点。还是再次感谢你。
    • 没问题!如果答案有帮助,请随时投票/接受。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2021-11-01
    相关资源
    最近更新 更多