gpt4 book ai didi

java - 使用 spring java 使用带有 xml 响应数组列表的 Rest api

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:19 25 4
gpt4 key购买 nike

我正在尝试使用为我提供 XML 响应的 REST API。我正在将 XML 响应映射到 POJO 文件。虽然最外层的 XML 元素已正确映射,但内部嵌套数组元素返回 null 值。以下是请求响应和其他代码文件:

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

最佳答案

完整的工作示例,请参阅:用户.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();
}
}
}

用户列表.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());
}
}

}

关于java - 使用 spring java 使用带有 xml 响应数组列表的 Rest api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40020489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com