Ошибка Springboot и IDEA: не удалось выполнить автоматическое подключение. Не найдено компонентов типа ‘EntityLinks’

#java #spring-boot

#java #пружинный ботинок

Вопрос:

Я слежу за Spring in action 5th edition, чтобы изучить Springboot. Когда я перехожу к главе 6, я обнаруживаю, что в моей IDEA IDE, похоже, есть ошибка для bean org.springframework.hateoas.server.Ссылки на объекты.

 package tech.enigma.web.api;

import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.hateoas.server.EntityLinks;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.enigma.Taco;
import tech.enigma.data.TacoRepository;


@RestController
@RequestMapping(path = "/design", produces = "application/json")
@CrossOrigin(origins = "*")
public class DesignTacoController
{
    private TacoRepository tacoRepo;
    private EntityLinks entityLinks;

    public DesignTacoController(TacoRepository tacoRepo, EntityLinks entitylinks)
    {
        this.tacoRepo = tacoRepo;
        this.entityLinks = entitylinks;
    }

    @GetMapping("/recent")
    public Iterable<Taco> recentTacos()
    {
        PageRequest page = PageRequest.of(
                0, 12, Sort.by("createAt").descending());

        return tacoRepo.findAll(page).getContent();
    }
}
 

В общедоступном DesignTacoController(TacoRepository tacoRepo, EntityLinks entitylinks) Конструктор, IDEA выдает ошибку «Не удалось выполнить автоматическое подключение. Бобы типа «EntityLinks» не найдены». Я могу скомпилировать и запустить свою программу, хотя я не уверен, что она работает должным образом.
С другими компонентами все работает нормально.
Это просто ошибка ИДЕИ или я что-то не так понял?

Ответ №1:

Это известная проблема. IntelliJ не всегда распознает все доступные компоненты из-за неправильного сканирования автоматически настроенных ресурсов. Что имеет значение, так это время выполнения Spring. Если это не приводит к ошибке, все готово.

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

1. спасибо, я удивляюсь, почему это трудно решить, так как я видел аналогичную проблему в stack overflow, опубликованную три года назад

2. IntelliJ необходимо проиндексировать доступные компоненты. Трудно понять, что будет находиться в области видимости на основе конкретной аннотации. Если библиотека даже изменит эти аннотации, она сломается. Если вы не знаете аннотацию, она сломается. Если он основан на библиотеках в пути к классу, которые intellij еще не знает, он сломается. Ему необходимо имитировать все это без запуска среды выполнения spring.

Ответ №2:

Аннотация @Autowired отсутствует. Либо выполните инъекцию конструктора, либо инъекцию установщика, тогда это сработает.

 package tech.enigma.web.api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.hateoas.server.EntityLinks;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.enigma.Taco;
import tech.enigma.data.TacoRepository;


@RestController
@RequestMapping(path = "/design", produces = "application/json")
@CrossOrigin(origins = "*")
public class DesignTacoController
{
    @Autowired
    private TacoRepository tacoRepo;
    @Autowired
    private EntityLinks entityLinks;

   

    @GetMapping("/recent")
    public Iterable<Taco> recentTacos()
    {
        PageRequest page = PageRequest.of(
                0, 12, Sort.by("createAt").descending());

        return tacoRepo.findAll(page).getContent();
    }
}
 

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

1. Автоматическая проводка необязательна с весны 4.3, если есть только один конструктор

2. Я пробовал все три метода, однако результат тот же.