繁体   English   中英

使用spring java将Rest api与xml响应的数组列表一起使用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM