Java 如何使用Jersey客户端使用Facebook JSON
我的代码不起作用:Java 如何使用Jersey客户端使用Facebook JSON,java,facebook,facebook-graph-api,jersey,jackson,Java,Facebook,Facebook Graph Api,Jersey,Jackson,我的代码不起作用: package com.foo.json; import javax.xml.bind.annotation.XmlRootElement; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; @XmlRootElement public class Me { public String id; public String name
package com.foo.json;
import javax.xml.bind.annotation.XmlRootElement;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
@XmlRootElement
public class Me {
public String id;
public String name;
public static void main(String[] args) {
Client client = Client.create();
WebResource web_resource = client.resource("https://graph.facebook.com/me?fields=id,name&access_token=deleted");
Me response = web_resource.get(Me.class);
System.out.println(response);
}
}
错误是:
Mar 28, 2012 11:56:43 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: A message body reader for Java class com.foo.json.Me, and Java type class com.foo.json.Me, and MIME media type text/javascript; charset=UTF-8 was not found
Mar 28, 2012 11:56:43 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: The registered message body readers compatible with the MIME media type are:
*/* ->
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
Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class com.foo.json.Me, and Java type class com.foo.json.Me, and MIME media type text/javascript; charset=UTF-8 was not found
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:550)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:506)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:684)
at com.sun.jersey.api.client.WebResource.get(WebResource.java:191)
at com.foo.json.Me.main(Me.java:18)
对URL进行加密的响应为:
$ curl --head https://graph.facebook.com/me?fields=id,name\&access_token=deleted
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Cache-Control: private, no-cache, no-store, must-revalidate
Content-Type: text/javascript; charset=UTF-8
Expires: Sat, 01 Jan 2000 00:00:00 GMT
Pragma: no-cache
X-FB-Rev: 532491
X-FB-Debug: EGBmGLM1xfMiWi8KILCkQaG6FTn+WnRufgVY7FXDxnQ=
X-Cnection: close
Content-Length: 0
Date: Wed, 28 Mar 2012 18:58:53 GMT
内容是:
$curl --head https://graph.facebook.com/me?fields=id,name\&access_token=deleted
{"id":"100001234567890","name":"My Name"}
我做错了什么?我确实希望使用Jersey客户端库,并且不希望切换到其他库。谢谢 尝试将您的
ME
课程更改为以下内容:
@XmlElement
public String id;
@XmlElement
public String name;
并为它们添加适当的getter和setter(!)。
此外,我建议您将
main()
方法移动到其他类。您只需提及Accept对application/json的响应头,因为它将作为json出现。
若并没有它,它将被视为text/javascript响应(检查curl响应的标题),这将为您提供ClientHandlerException
运行代码:
TestClient.java
public class TestClient {
public static void main(String[] args) {
Client client = Client.create();
WebResource web_resource = client.resource("https://graph.facebook.com/me?fields=id,name&access_token=deleted");
MyBean response=web_resource.accept(MediaType.APPLICATION_JSON).get(MyBean.class);
System.out.println(response.getId());
}
}
@XmlRootElement
public class MyBean{
String id;
String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
MyBean.java
public class TestClient {
public static void main(String[] args) {
Client client = Client.create();
WebResource web_resource = client.resource("https://graph.facebook.com/me?fields=id,name&access_token=deleted");
MyBean response=web_resource.accept(MediaType.APPLICATION_JSON).get(MyBean.class);
System.out.println(response.getId());
}
}
@XmlRootElement
public class MyBean{
String id;
String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
您好,谢谢您的评论,但它不起作用。问题是我试图使用JSON(而不是XML)。我已经包含了jersey json依赖项/JAR,但是我没有正确配置它来扫描我的Me.java类并生成一个适当的消息体读取器(我想)。添加下面的行是可行的,但它很难看,因为我将它从web_资源中作为字符串进行一次解组,然后通过一个单独的json上下文再次解组。我相信有更好的方法,我希望有人能给我指点`JSONJAXBContext json_jaxb_context=新的JSONJAXBContext(Me.class);String response=web_resource.get(String.class);Me Me=json\u jaxb\u context.createJSONUnmarshaller().unmarshalFromJSON(新的StringReader(响应),Me.class)`只要让你知道,如果你已经对接受的答案感到满意,你可以手动奖励奖金。有助于从特色(带奖金的问题)选项卡中清除此问题。感谢您指出这一点!