Ошибка ArrayList в HTTP-сервлете

1

Я использую Floodlight REST API для мониторинга созданной виртуальной сети в mininet. Моя цель - отобразить arraylist всех коммутаторов, хостов и статистики для коммутаторов в веб-браузере с использованием веб-сервера Apache Tomcat и HTTP Servlet. Приложение успешно отображает все коммутаторы и хосты, но сбой при добавлении статистики для коммутаторов.

Когда я сопоставляю строку JSON с объектами java, сервер возвращает ошибку в этой строке:

ArrayList<Switch> queues = mapper.readValue(queueJson, new TypeReference<ArrayList<Switch>>() {
    });

Ошибка:

HTTP status 500 - can not deserialize instance of java.util.arraylist out of start_object token

Я тестировал его без части статистики переключения (очереди) (только с хостами и устройствами), и все работает нормально, но когда я добавляю очереди ArrayList, он возвращает вышеупомянутую ошибку.

Как я могу решить эту проблему? Мой код показан ниже. заранее спасибо

package core;

import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.restlet.data.MediaType;
import org.restlet.resource.ClientResource;
import org.restlet.resource.ResourceException;

import pojos.Device;
import pojos.Switch;

@WebServlet("/PrintInfo")
public class PrintInfo extends HttpServlet {
private static final long serialVersionUID = 1L;

public PrintInfo() {
    super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // create ClientResource object

    // List at the switches in the network
    ClientResource cResourceSwitches = new ClientResource("http://127.0.0.1:8080/wm/core/controller/switches/json");
    StringWriter sWriterSwitches = new StringWriter();

    // List all the devices (hosts) in the network
    ClientResource cResourceDevices = new ClientResource("http://127.0.0.1:8080/wm/device/");
    StringWriter sWriterDevices = new StringWriter();

    // List the statistics of the switches in the network
    ClientResource cResourceQueues = new ClientResource("http://127.0.0.1:8080/wm/core/switch/all/queue/json");
    StringWriter sWriterQueues = new StringWriter();

    // get JSON data about switches; the data is put in a string writer
    try {

        // Getting data from Floodlight as a JSON string

        cResourceSwitches.get(MediaType.APPLICATION_JSON).write(sWriterSwitches);
        cResourceDevices.get(MediaType.APPLICATION_JSON).write(sWriterDevices);

        cResourceQueues.get(MediaType.APPLICATION_JSON).write(sWriterQueues);

    } catch (ResourceException e) {
        request.setAttribute("error", "Connection with FLoodLight failed!");
        request.getRequestDispatcher("WEB-INF/connectionError.jsp").forward(request, response);
        return;
    }

    // put data from string writer into a string object
    String switchesJson = sWriterSwitches.toString();
    String devicesJson = sWriterDevices.toString();
    String queueJson = sWriterQueues.toString();

    // map JSON data to Java objects
    // ObjectMapper converts between JSON - Java
    ObjectMapper mapper = new ObjectMapper();


    ArrayList<Switch> switches = mapper.readValue(switchesJson, new TypeReference<ArrayList<Switch>>() {
    });
    ArrayList<Device> devices = mapper.readValue(devicesJson, new TypeReference<ArrayList<Device>>() {
    });

    ArrayList<Switch> queues = mapper.readValue(queueJson, new TypeReference<ArrayList<Switch>>() {

    });

    // put objects in the request so we can use them later in the JSP
    request.setAttribute("switches", switches);
    request.setAttribute("devices", devices);
    request.setAttribute("queues", queues);

    // redirect to the jsp
    request.getRequestDispatcher("WEB-INF/showInfo.jsp").forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
        IOException {

}

}

  • 0
    Попробуйте добавить List<Whatever> Wh what List<Whatever> в объект DTO и сериализовать этот DTO для связи.
Теги:
servlets
tomcat
rest

1 ответ

1

Решаемые. Класс Switch в "ArrayList" не может использоваться для статистики коммутатора. Должен быть реализован новый класс, который возвращает значения в

http://127.0.0.1:8080/wm/core/switch/all/queue/json 

URI.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню