简体   繁体   English

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

[英]Consuming Rest api with array list of xml response using spring java

I'm trying to consume REST API which gives me XML response.I'm mapping XML response to POJO file.While the outer most XML element is mapped properly,the inner nested array element is returning null values. 我正在尝试使用REST API,它给我XML响应。我将XML响应映射到POJO文件。虽然最外层的XML元素被正确映射,但内部嵌套数组元素返回空值。 Following are the request response and other code files : 以下是请求响应和其他代码文件:

XML Response: 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 class ArrayofRouteListItem.java : 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 Class RouteListItem.java 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;
    ......

}

MY Main Application (Controller.java): 我的主要应用程序(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();
        }
    }

The Output which I'm getting are : 我得到的输出是:

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

Complete Working example, Please see this: User.java 完整的工作示例,请看: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 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 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 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 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