Как прочитать файл и назначить его ArrayList весной?

Рассмотрим следующие классы:

public class Store {
    private final ArrayList<String> store;
    public ArrayList<String> getStore() {
        return store;
    }
    public Store(ArrayList<String> store){
        this.store = store;
    }
}

У меня есть текстовый файл с именем input.txt
У меня есть обычный контроллер с аннотацией @RestController следующим образом:

@RestController
@RequestMapping(value="/test")
public class Controller {

    .
    .
    .

}

Мне нужно выполнить следующие операции:

  1. Прочитайте input.txt, используя Files.readAllLines(path,cs) (из JDK 1.7)
  2. Установите возвращаемое значение (List<String>) на Store.store
  3. Я хочу полностью использовать аннотации Spring (я пишу приложение с весенней загрузкой)
  4. Мне нужно, чтобы Store был компонентом Singleton.
  5. Магазин должен быть инициализирован во время начальной загрузки моего приложения.

Этот вопрос может быть слишком расплывчатым, но я совершенно не представляю, как сделать его более конкретным.

P.S.
Я новичок в Spring.


person Adit A. Pillai    schedule 26.05.2017    source источник
comment
У меня есть пара вопросов, которые должны сделать ваш вопрос более конкретным... 1) Вы пытаетесь создать веб-службу RESTful? Если да, нужно ли передавать этот файл на сервер, находится ли он на сервере или на локальном компьютере пользователя? 3) когда вы говорите о магазине arrayList‹String›, это список имен магазинов? В каком формате вы ожидаете, что input.txt будет?   -  person Steve    schedule 26.05.2017
comment
stackoverflow .com/questions/1363310/ и mkyong.com/spring/   -  person StanislavL    schedule 26.05.2017
comment
Да, я пытаюсь сделать RESTful WS. и input.txt находится на сервере, формат UTF-8.   -  person Adit A. Pillai    schedule 26.05.2017


Ответы (1)


Кажется, что использование Constructor Injection было бы идеальным.

public class Store {
    private final List<String> storeList;

    @Autowired
    public Store(@Value("${store.file.path}") String storeFilePath) throws IOException {
            File file = new File(storeFilePath);
            storeList = Files.readAllLines(file.toPath());
    }
}

вы захотите добавить свойство store.file.path в свой файл свойств, который считывается вашим контекстом spring. Вы также захотите добавить определение bean-компонента для Store.

<bean id="Store" class="com.test.Store" />

Тогда ваш Rest Controller может выглядеть примерно так:

@RestController
@RequestMapping(value="/store")
public class StoreRestController {

    @Autowired
    Store store;

    @RequestMapping(value="/get", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Store> getStore(HttpServletRequest request) {
        ResponseEntity<Store> response = new ResponseEntity<Store>(store, HttpStatus.OK);
        return response;
    }
}

Есть несколько разных способов написать инъекцию и контроллер, так что проведите небольшое исследование и используйте метод, который лучше всего соответствует вашим потребностям.

person Steve    schedule 26.05.2017
comment
Я бы подумал о добавлении кеша, так как чтение файла является тяжелой операцией и должно быть выполнено один раз - person nowszy94; 26.05.2017
comment
Файл читается только один раз для экземпляра Store, поэтому, если для компонента используется область singleton по умолчанию, файл будет прочитан только один раз. - person jlumietu; 27.05.2017
comment
Это именно то, что я искал. Спасибо - person Adit A. Pillai; 27.05.2017