[英]Consuming Rest api with array list of xml response using spring java
我正在尝试使用REST API,它给我XML响应。我将XML响应映射到POJO文件。虽然最外层的XML元素被正确映射,但内部嵌套数组元素返回空值。 以下是请求响应和其他代码文件:
XML响应:
<ArrayOfRouteListItem
xmlns="http://some url..."
xmlns:i="http://url...">
<RouteListItem>
<ArrivalCountry>(Saronic Islands, Greece)</ArrivalCountry>
<ArrivalPort>Agistri</ArrivalPort>
<DepartCountry>(Saronic Islands, Greece)</DepartCountry>
<DepartPort>Aegina</DepartPort>
<HeaderKey>HA</HeaderKey>
<ReturnFlag>R</ReturnFlag>
</RouteListItem>
<RouteListItem>
<ArrivalCountry>(Saronic Islands, Greece)</ArrivalCountry>
<ArrivalPort>Aegina</ArrivalPort>
<DepartCountry>(Greece)</DepartCountry>
<DepartPort>Piraeus</DepartPort>
<HeaderKey/>
<ReturnFlag>R</ReturnFlag>
</RouteListItem>
</ArrayOfRouteListItem>
POJO类ArrayofRouteListItem.java:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="ArrayOfRouteListItem" , namespace="http://some url ...")
public class ArrayOfRouteListItem {
@XmlElement(name = "RouteListItem")
public List<RouteListItem> routeItem = new ArrayList<RouteListItem>();
}
POJO类RouteListItem.java
@XmlRootElement(name="RouteListItem")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace="http://some url ..")
public class RouteListItem implements Serializable {
public static final long serialVersionUID = 1L;
@XmlElement(name="ArrivalCountry")
public String arrivalCountry;
@XmlElement(name="ArrivalPort")
public String arrivalPort;
@XmlElement(name="DepartCountry")
public String departCountry;
@XmlElement(name="DepartPort")
public String departPort;
@XmlElement(name="HeaderKey")
public String headerKey;
@XmlElement(name="ReturnFlag")
public String returnFlag;
......
}
我的主要应用程序(Controller.java):
public class Controller {
private static DefaultHttpClient httpClient = new DefaultHttpClient();
public static void main(String[] args) throws Exception
{
demoGetRESTAPI();
}
public static void demoGetRESTAPI() throws Exception
{
try
{
HttpGet getRequest = new HttpGet("https://www.url...");
getRequest.addHeader("accept", "application/xml");
HttpResponse response = httpClient.execute(getRequest);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200)
{
throw new RuntimeException("Failed with HTTP error code : " + statusCode);
}
HttpEntity httpEntity = response.getEntity();
String apiOutput = EntityUtils.toString(httpEntity);
System.out.println("xml file content : " + apiOutput);
JAXBContext jaxbContext = JAXBContext.newInstance(ArrayOfRouteListItem.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(apiOutput);
System.out.println("reader object : " + reader.toString());
ArrayOfRouteListItem routeList = (ArrayOfRouteListItem) unmarshaller.unmarshal(reader);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(routeList, System.out);
System.out.println("size: " + routeList.getRouteItem().size() + " .get(0) : " + routeList.getRouteItem().get(0).getArrivalCountry());
}
finally
{
//Important: Close the connect
httpClient.getConnectionManager().shutdown();
}
}
我得到的输出是:
reader object : java.io.StringReader@38c5cc4c
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:ArrayOfRouteListItem xmlns:ns2="http://some url...">
<RouteListItem/>
<RouteListItem/>
<RouteListItem/>
<RouteListItem/>
<RouteListItem/>
<RouteListItem/>
</ns2:ArrayOfRouteListItem>
routeList.size: 6 routeList.getRouteItem().get(0).getArrivalCountry() : null
完整的工作示例,请看:User.java
package com.tutorialspoint;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private String profession;
public User() {
}
public User(int id, String name, String profession) {
this.id = id;
this.name = name;
this.profession = profession;
}
public int getId() {
return id;
}
@XmlElement
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
public String getProfession() {
return profession;
}
@XmlElement
public void setProfession(String profession) {
this.profession = profession;
}
}
UserDao.java
package com.tutorialspoint;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
public List<User> getAllUsers() {
List<User> userList = null;
try {
File file = new File("Users.dat");
if (!file.exists()) {
User user = new User(1, "Mahesh", "Teacher");
userList = new ArrayList<User>();
userList.add(user);
saveUserList(userList);
} else {
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
userList = (List<User>) ois.readObject();
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return userList;
}
private void saveUserList(List<User> userList) {
try {
File file = new File("Users.dat");
FileOutputStream fos;
fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(userList);
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
UserList.java
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
*
* @author CE
*/
@XmlRootElement(name="users")
public class UserList {
@XmlElement(name="user")
List<User> users = new ArrayList<User>();
}
UserService.java
package com.tutorialspoint;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/UserService")
public class UserService {
UserDao userDao = new UserDao();
@GET
@Path("/users")
@Produces(MediaType.APPLICATION_XML)
public List<User> getUsers() {
return userDao.getAllUsers();
}
}
WSCLiente .java
package com.tutorialspoint;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URL;
import java.nio.charset.Charset;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
public class WSCLiente {
public static void main(String[] args) throws Exception {
StringBuilder sURL = new StringBuilder(100);
StringBuilder sb1 = new StringBuilder();
try {
sURL.append("http://localhost:2016/Simpleweb/rest/UserService/users");
InputStream is = new URL(sURL.toString()).openStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
int cp;
while ((cp = rd.read()) != -1) {
sb1.append((char) cp);
}
} catch (Exception me) {
System.out.println("## Exception :" + me.getMessage());
}
String apiOutput = sb1.toString();
System.out.println("xml file content : " + apiOutput);
JAXBContext jaxbContext = JAXBContext.newInstance(UserList.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(apiOutput);
UserList uu= (UserList) unmarshaller.unmarshal(reader);
for (int i=0; i<uu.users.size();i++) {
User u = uu.users.get(i);
System.out.println("Yes:"+u.getProfession());
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.