Как сделать ответ объекта в spring boot

#java #spring-boot #collections

Вопрос:

Я создал api для извлечения всех сведений о экземплярах Ec2, но я не знаю, как сделать правильный ответ на него и отправить, в настоящее время я использую список массивов, но он возвращает массивы массива. Как сделать идеальный ответ, пожалуйста, помогите

Мой код —

 public ArrayList<ArrayList<String>> getAllInstances() {
        boolean done = false;
        ArrayList<ArrayList<String>> instances = new ArrayList<>();
        DescribeInstancesRequest request = new DescribeInstancesRequest();
        while (!done) {
            DescribeInstancesResult response = ec2Client.describeInstances(request);
        
            for (Reservation reservation : response.getReservations()) {
                for (Instance instance : reservation.getInstances()) {
                    ArrayList<String> list = new ArrayList<String>();
                    list.add(instance.getInstanceId());
                    list.add(instance.getInstanceType());
                    list.add(instance.getState().getName());
                    System.out.printf(
                            "Found instance with id %s, "  
                                    "AMI %s, "  
                                    "type %s, "  
                                    "state %s "  
                                    "and monitoring state %s",
                            instance.getInstanceId(),
                            instance.getImageId(),
                            instance.getInstanceType(),
                            instance.getState().getName(),
                            instance.getMonitoring().getState());
                    instances.add(list);
         }
            }
            request.setNextToken(response.getNextToken());
            if (response.getNextToken() == null) {
                done = true;
            }
            System.out.println("flag stats = " done);
        }
        return  instances;
    }
 

Ответ —

 [["i-09xxxxxxf5b82","t2.nano","running"],["i-03ddxxxxx956d099","t2.micro","running"]]
 

Как сделать его правильным json-ответом.

Комментарии:

1. Почему бы не использовать сопоставление объектов json с использованием отдельного класса для ответа, таким образом, у вас будет правильный список каждого экземпляра с правильным сопоставлением значений ключа? кроме того, какой ответ вам нужен? здесь необходима некоторая ясность

2. Я хочу, чтобы этот ответ был таким: [{«id»: «132sdsxxxx», «type»: «t2.nano», «status’, «running»}, {…}]

3. вместо ArrayList<ArrayList<String>> вам следует попробовать List<myInstance> ; здесь myInstance может наследовать свойства экземпляра только те, которые вам нужны; но вы также можете использовать экземпляр напрямую, у него просто будут дополнительные параметры

Ответ №1:

Я бы создал новый класс с полями, которые вам нужно вернуть, т.Е.:

 public class InstanceDetails {
    private String instanceId;
    private String instanceType; // Could use an enum for this if you know all possible values
    private String state;
    // further fields as required
    // constructor / getters / setters
}
 

Затем вы можете создать объекты этого класса вместо своего списка и добавить их в список экземпляров. Таким образом, ваше определение функции будет:

 public List<InstanceDetails> getAllInstances() {

}
 

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

Вам также может понадобиться библиотека JSON (например, Jackson) для анализа выходных данных в зависимости от того, куда вы их отправляете.