[英]Getting JSON out put from restful java client
I'm developing a web service using REST (Jersey 1.8). 我正在使用REST(Jersey 1.8)开发Web服务。 Currently I'm using XML to communicate between the Java client and the server. 目前我正在使用XML在Java客户端和服务器之间进行通信。
I need to change it to JSON: how can I do that? 我需要将其更改为JSON:我该怎么做? I have bunch of auto generated code from NetBeans, and have no idea what to do and how. 我有大量来自NetBeans的自动生成代码,并且不知道该做什么以及如何做。 When the testing the service it shows the JSON data. 在测试服务时,它显示JSON数据。 What I'm unable to do is deal with it within my main
method. 我无法做的是在我的main
方法中处理它。
these are the tutorial I followed 这些是我遵循的教程
My Java client main
method: 我的Java客户端main
方法:
public class SOATestClient {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
PersonJerseyClient client = new PersonJerseyClient();
ClientResponse response = client.findAll_XML(ClientResponse.class);
GenericType<List<Person>> genericType = new GenericType<List<Person>>() {
};
// Returns an ArrayList of Players from the web service
List<Person> data = new ArrayList<Person>();
data = (response.getEntity(genericType));
System.out.println("Retreiving and Displaying Players Details");
for (Person person : data) {
System.out.println("FirstName: " + person.getName());
System.out.println("ID : " + person.getId());
System.out.println(" Age : " + person.getAge());
}
client.close();
}
}
personjerseycilent personjerseycilent
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package jerseyclients;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.UniformInterfaceException;
import com.sun.jersey.api.client.WebResource;
/**
* Jersey REST client generated for REST resource:PersonFacadeREST
* [entity.person]<br>
* USAGE:
* <pre>
* PersonJerseyClient client = new PersonJerseyClient();
* Object response = client.XXX(...);
* // do whatever with response
* client.close();
* </pre>
*
* @author rj45
*/
public class PersonJerseyClient {
private WebResource webResource;
private Client client;
private static final String BASE_URI = "http://localhost:8080/SOATestService/resources";
public PersonJerseyClient() {
com.sun.jersey.api.client.config.ClientConfig config = new com.sun.jersey.api.client.config.DefaultClientConfig();
client = Client.create(config);
webResource = client.resource(BASE_URI).path("entity.person");
}
public void remove(String id) throws UniformInterfaceException {
webResource.path(java.text.MessageFormat.format("{0}", new Object[]{id})).delete();
}
public String countREST() throws UniformInterfaceException {
WebResource resource = webResource;
resource = resource.path("count");
return resource.accept(javax.ws.rs.core.MediaType.TEXT_PLAIN).get(String.class);
}
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 <T> T findAll_JSON(Class<T> responseType) throws UniformInterfaceException {
WebResource resource = webResource;
return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
}
public void edit_XML(Object requestEntity) throws UniformInterfaceException {
webResource.type(javax.ws.rs.core.MediaType.APPLICATION_XML).put(requestEntity);
}
public void edit_JSON(Object requestEntity) throws UniformInterfaceException {
webResource.type(javax.ws.rs.core.MediaType.APPLICATION_JSON).put(requestEntity);
}
public void create_XML(Object requestEntity) throws UniformInterfaceException {
webResource.type(javax.ws.rs.core.MediaType.APPLICATION_XML).post(requestEntity);
}
public void create_JSON(Object requestEntity) throws UniformInterfaceException {
webResource.type(javax.ws.rs.core.MediaType.APPLICATION_JSON).post(requestEntity);
}
public <T> T findRange_XML(Class<T> responseType, String from, String to) throws UniformInterfaceException {
WebResource resource = webResource;
resource = resource.path(java.text.MessageFormat.format("{0}/{1}", new Object[]{from, to}));
return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType);
}
public <T> T findRange_JSON(Class<T> responseType, String from, String to) throws UniformInterfaceException {
WebResource resource = webResource;
resource = resource.path(java.text.MessageFormat.format("{0}/{1}", new Object[]{from, to}));
return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
}
public <T> T find_XML(Class<T> responseType, String id) throws UniformInterfaceException {
WebResource resource = webResource;
resource = resource.path(java.text.MessageFormat.format("{0}", new Object[]{id}));
return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType);
}
public <T> T find_JSON(Class<T> responseType, String id) throws UniformInterfaceException {
WebResource resource = webResource;
resource = resource.path(java.text.MessageFormat.format("{0}", new Object[]{id}));
return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
}
public void close() {
client.destroy();
}
}
I try to access it with the following, and deal it with same way as XML, 我尝试使用以下内容访问它,并以与XML相同的方式处理它,
ClientResponse response = client.findAll_JSON(ClientResponse.class);
but it gives me 但它给了我
Exception in thread "main" javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException
- with linked exception:
[com.sun.istack.internal.SAXParseException2; lineNumber: 0; columnNumber: 0; unexpected element (uri:"", local:"id"). Expected elements are <{}person>]
at com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.readFrom(AbstractListElementProvider.java:251)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:553)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:523)
at soatestclient.SOATestClient.main(SOATestClient.java:33)
Caused by: javax.xml.bind.UnmarshalException
I would be grateful to if you could help me on this matter. 如果你能在这件事上帮助我,我将不胜感激。 Thank you! 谢谢!
i resolved the same question. 我解决了同样的问题。 if your exception is : unexpected element (uri:"", local:"id")......... 如果您的例外是:意外元素(uri:“”,local:“id”).........
don't forget add follow code: 别忘了添加以下代码:
DefaultClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(clientConfig);
then the code: 那么代码:
return resource.type(MediaType.APPLICATION_JSON_TYPE).get(new GenericType<List<MyClass>>(){});
will be ok. 会好的。
1) Whoever is generating this error, is clearly expecting XML input. 1)产生此错误的人显然期望XML输入。 Not JSON. 不是JSON。 You need to change that ASAP: 你需要尽快改变:
javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException
com.sun.istack.internal.SAXParseException2;
<= javax.xml.bind and SAXParse are both XML-only: JSON not invited
2) The stuff in your screen shot (presumably Jersey?) is definitely OK. 2)屏幕截图中的东西(大概是泽西岛?)绝对可以。
3) I haven't followed the whole tutorial, and you haven't given enough information to tell where you went astray. 3)我没有按照整个教程,你没有提供足够的信息来告诉你误入歧途的地方。
SUGGESTION: 建议:
Just retrace your steps in the tutorial, and make sure you're selecting "JSON" ( not XML, and not SOAP) every step of the way. 只需回顾教程中的步骤,并确保在每一步都选择“JSON”( 不是 XML,而不是 SOAP)。
=========== ADDENDUM =========== =========== ADDENDUM ===========
OK - Thanx for the update. 好的 - 用于更新的Thanx。 Here's where we're at: 这是我们所处的位置:
1) This is the problem: 1)这是问题所在:
Exception in thread "main" javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException
- with linked exception:
[com.sun.istack.internal.SAXParseException2; lineNumber: 0; columnNumber: 0; unexpected element (uri:"", local:"id"). Expected elements are <{}person>]
at com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.readFrom(AbstractListElementProvider.java:251)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:553)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:523)
at soatestclient.SOATestClient.main(SOATestClient.java:33)
Caused by: javax.xml.bind.UnmarshalException
2) You said this stack traceback is coming from the client. 2)你说这个堆栈追溯来自客户端。
So your server is 100% OK - the ONLY thing you need to do is fix your client. 所以你的服务器是100%好的 - 你唯一需要做的就是修复你的客户端。 Cool :) 酷:)
3) The traceback shows the client is expecting XML ... but getting JSON instead. 3)回溯显示客户端期待XML ...但是获取JSON。
So the ONLY thing you should need to fix is to tell your client "Hey: read JSON, not XML". 因此,您需要解决的唯一问题是告诉您的客户“嘿:读取JSON,而不是XML”。 Again - cool :) 再次 - 很酷:)
4) How do you do that? 4)你是怎么做到的?
Well, for starters, you need to get rid of this line (if you haven't already): 那么,对于初学者来说,你需要摆脱这一行(如果你还没有):
// Bad, bad bad. Don't do this!|
ClientResponse response = client.findAll_XML(ClientResponse.class);
5) You might want to change other parts of your client code - I don't know. 5)您可能想要更改客户端代码的其他部分 - 我不知道。
You might also want to change your client's configuration - I don't know that, either. 您可能还想更改客户端的配置 - 我也不知道。
6) Suggestion: look at this other tutorial - it might point you in the right direction: 6)建议:看看这个其他教程 - 它可能会指出你正确的方向:
NOTE: 注意:
WHATEVER you need to do - it should be REALLY simple! 无论你需要做的-它应该是很简单的! Please review the link, review your code and your test client configuration ... and post back what you find! 请查看链接,查看您的代码和测试客户端配置...并回发您找到的内容!
Thank you in advance... 先感谢您...
http://smoothexample.com/webservices/apache_cxf_rest_web_services_client.html http://smoothexample.com/webservices/apache_cxf_rest_web_services_client.html
The above example gives sample client application using apache cxf, here client can consume both xml and json by providing the "Accept" header. 上面的示例使用apache cxf提供示例客户端应用程序,此处客户端可以通过提供“Accept”标头来同时使用xml和json。
Also a simple example for cxf rest web service is also available here, which even returns both xml and json based on the "Accept" header. 此外,还提供了cxf rest web服务的简单示例,它甚至可以根据“Accept”标头返回xml和json。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.