Как внедрить или передать JPARepository в контроллер?

126
26 апреля 2022, 08:40

Есть класс "Parser", который берёт загруженный файл через get запрос и заносит данные в базу данных H2. Если использовать его в классе со SpringApplication.run, создав бин "CommandLineRunner demo(Repository repo)", то класс обрабатывает файл. При попытке воспользоваться тем же классом "Parser" в классе-контроллере, не удается передать репозиторий. Пробовал ставить @Autowired на переменную репозитория в классе "Parser", внедрял репозиторий в метод контроллера. Не получается, переменная с репозиторием null и всё.

Parser.java

@Component
public class Parser {
    Customer data;
    Visit visit;
    Cart cart;
    Pay pay;
    Calendar calendar = new GregorianCalendar();
    InetAddress ip;
    URL url;
    CartRepo cartRepo;
    CustomerRepo customerRepo;
    PayRepo payRepo;
    VisitRepo visitRepo;
    public void parsing(File logs){код обработки}

Controller.java

//метод обработки файла
public String parseFile(Model model,
                            Parser parser,
                            @RequestParam("file") MultipartFile file){
        if (!file.isEmpty()) {
            try {
                //Получение файла UploadFile
                parser.parsing(UploadFile);
                return "reports/list_of_reports.html";
            } catch (Exception e) {
                //обработка исключений
                return "error.html";
            }

Git. В ветке main, работающий вариант класса, в ветке dev ошибка.

Answer 1

Вы передаете Parser параметром вместе с моделью и RequestParam-ом. Откуда форма, в которой вы вызываете метод POST знает про ваш парсер? Может, его нужно инжектить в том же контроллере, но выше?

@Controller
public class IndexController {
private final Parser parser;
@Autowired
public IndexController(Parser parser) {
    this.parser = parser;
}
@GetMapping("/")
public String index(){
    return "index.html";
}
@PostMapping("/")
public String parseFile(Model model,
                        @RequestParam("file") MultipartFile file){
    if (!file.isEmpty()) {
        try {
            byte[] bytes = file.getBytes();
            File UploadFile = new File("upload/logs.txt");
            BufferedOutputStream stream =
                    new BufferedOutputStream(new FileOutputStream(UploadFile));
            stream.write(bytes);
            stream.close();
            parser.parsing(UploadFile);
            return "reports/list_of_reports.html";
        } catch (Exception e) {
            model.addAttribute("message","Вам не удалось загрузить " + file.getName() + " => "+e.getMessage());
            return "error.html";
        }
    } else {
        model.addAttribute("message","Вам не удалось загрузить " + file.getName() + " потом что файл пустой.");
        return "error.html";
    }
}

}

READ ALSO
Как сделать плавный динамический выпадающий список?

Как сделать плавный динамический выпадающий список?

Я хочу сделать плавный выпадающий список

327
Появление кнопок после прохождения теста js

Появление кнопок после прохождения теста js

Продолжаю делать игру на js игру "Верю/не верю"На экране поочередно появляются заголовки утверждений

98
неправильная позиция для кнопки-картинки

неправильная позиция для кнопки-картинки

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

261
Как разместить четыре картинки "квадратом" внутри секции?

Как разместить четыре картинки "квадратом" внутри секции?

Есть такая секция в учебном макете:

282