#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. Я пробовал все три метода, однако результат тот же.