Как создать коллекцию объектов в SpringBoot без базы данных? - PullRequest
0 голосов
/ 18 декабря 2018

Я новичок в SpringBoot.Я не знаю, как создать несколько объектов одного типа таким образом, чтобы впоследствии можно было использовать эти объекты, например, в контроллере.

Допустим, я хотел бы создать коллекцию / список объектов (скажем, коллекция Кроликов), когда приложение запускается:

 @SpringBootApplication
    public class Application {

        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
            // I would like to create here a collection
            // or a list of objects (let's say collection of Rabbits)
        }

}

Я хотел бы иметь возможность использовать эти объекты позже в контроллере, чтобы получить некоторую информацию (полученную, например, по индексу в списке).

Как правильно сохранить состояние моей модели без базы данных?

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Используя Spring, вам нужно создавать объекты в контексте Spring, иначе экземпляры, созданные Spring, не смогут их найти.Решением может быть помещение их в класс, помеченный @Configuration, и получение их с аннотацией @Autowired.Аннотация @Configuration:

Указывает, что класс объявляет один или несколько @ методов Bean и может обрабатываться контейнером Spring для генерации определений bean и запросы на обслуживание для этих компонентов во время выполнения.

Вы можете использовать его следующим образом:

 @Configuration
 public class MyConfiguration {

    @Bean
    public MyClass getMyClass() {
       MyClass myClass = ...
       ...
       return myClass;
    }
}

@Controller
public class MyController {
  @Autowired
  private MyClass myClass;

  public void method() {
     // Use myClass instance as you like
  }
} 

Вы также можете генерировать стандарт java.util.List, но в этом случае лучшедать имя сгенерированному компоненту, например:

@Configuration
public class MyConfiguration {

    @Bean("myname") // To give an explicit name to the List
    public List getMyList() {
       List myList = ...
       ...
       return myList;
    }
}

@Controller
public class MyController {
  @Autowired
  @Qualifier("myname")  // To retrieve a List with a specific name
  private List myList;

  public void method() {
     // Use myList instance as you like
  }
} 
0 голосов
/ 18 декабря 2018

Игнорирование проблем синхронизации.

Вы можете создать список и добавить его в свои контроллеры.

или что мне нравится делать - это оборачивать это в хранилище.Это изолирует вас от базового источника данных и может быть изменено позже.

Обратите внимание, что синхронизация важна для этого типа структуры данных, поскольку у вас может быть много потоков, обновляющих хранилище.

package com.example.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class Demo1Application {

    public static void main(String[] args) {
        SpringApplication.run(Demo1Application.class, args);
    }

    @Bean
    public RabbitRepository rabbitRepository() {
        RabbitRepository rabbitRepository = new RabbitRepository();
        rabbitRepository.add("Bugs");
        rabbitRepository.add("Flopsy");
        return rabbitRepository;
    }

    public static class RabbitRepository {
        private List<Rabbit> rabbits = Collections.synchronizedList(new ArrayList<Rabbit>());

        public List<Rabbit> getAll() {
            return rabbits;
        }

        public Rabbit add(String rabbitName) {
            Rabbit rabbit = new Rabbit(rabbitName);
            this.rabbits.add(rabbit);
            return rabbit;
        }

        public Optional<Rabbit> findById(int id) {
            return this.rabbits.stream().filter(r-> r.getId() == id).findFirst();
        }

    }

    public static class Rabbit {
        private final String name;

        private final int id;

        private static AtomicInteger counter = new AtomicInteger();

        public Rabbit(String name) {
            super();
            this.name = name;
            this.id = counter.incrementAndGet();
        }

        public String getName() {
            return name;
        }


        public int getId() {
            return this.id;
        }


    }

    @RestController
    @RequestMapping("/rabbits")
    public static class RabbitController {
        private final RabbitRepository repository;

        public RabbitController(final RabbitRepository repository) {
            this.repository = repository;
        }

        @GetMapping
        public List<Rabbit> getAll() {
            return repository.getAll();
        }

        @PostMapping("/{name}")
        //You can also use requestparam / requestbody and probably should
        public Rabbit addRabbit(@PathVariable("name") String name) {
            return repository.add(name);
        }

        @GetMapping("/id/{id}")
        public Optional<Rabbit> findById(@PathVariable("id") int id) {
            return repository.findById(id);
        }

    }

}

Тесты скручивания

➜  ~ curl localhost:8080/rabbits            
    [{"name":"Bugs","id":1},{"name":"Flopsy","id":2}]%
➜  ~ curl localhost:8080/rabbits/id/2       
    {"name":"Flopsy","id":2}%                                                       
➜  ~ curl -XPOST localhost:8080/rabbits/Babs
    {"name":"Babs","id":3}%                                                         
➜  ~ curl localhost:8080/rabbits            
    [{"name":"Bugs","id":1},{"name":"Flopsy","id":2},{"name":"Babs","id":3}]%
0 голосов
/ 18 декабря 2018

Тебе нужно что-то вроде этого, я думаю!

@Component
public class RabbitListHolder {
   private List<Rabbit> rabbits = new ArrayList<Rabbit>
   public void initializeList(){
      rabbits.add(new Rabbit('white', 3));
      ...
   }

}

@Controller
public class RabbitsRessource{
 @Autowired
RabbitListHolder rabbitListHolder;
 ...
@GetMapping("/rabbits")
public List<Rabbits> getRabbits(){
  rabbitListHolder.initializeList();
  return rabbitListHolder.getRabbits();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...