В моем весеннем загрузочном приложении у меня есть репозиторий класса, который можно найти по имени класса.
Class<?> repo = Class.forName("com.example.demo.repository." + modelName + "Repository");
где modelName является строкой.
repo.toString() возвращает
interface com.example.demo.repository.LaptopRepository
Я хочу иметь возможность использовать методы LaptopRepository.findAll(). Я точно не знаю, какое название модели у меня будет. Поэтому я не мог использовать аннотацию @Autowired вне метода.
Вместо этого я хочу использовать LaptopRepository внутри метода, который принимает атрибут modelName.
@GetMapping("/administration")
public String getModelInstances(@RequestParam("modelName")String modelName, Model model) throws ClassNotFoundException {
Class<?> repo = Class.forName("com.example.demo.repository." + modelName + "Repository");
// @Autowired
// repo repoRepository;
model.addAttribute("objects", repoRepositories.findAll());
return "administration";
}
Я не уверен, что findAll
сработает при смешивании отражения и JpaRepository
Используйте метод getBean() контекста Spring. Но будьте осторожны: это огромная дыра в безопасности: вы, по сути, позволяете любому вызывать findAll() в любом из ваших репозиториев, что потенциально дает доступ к конфиденциальной информации или просто приводит к сбою вашего сервера из-за большого количества сущностей, которые будут загружены в память. По крайней мере, вам нужно проверить, входит ли представленная модель в четко определенный список допустимых значений.
Просто используйте контекст приложения Sping, чтобы получить желаемый компонент репозитория по его типу.
1) Контекст Autowire в вашем контроллере
@Autowired
private ApplicationContext appContext;
2) Используйте его в своем методе
appContext.getBean(Class.forName("com.example.demo.repository." + modelName + "Repository"));
Но как я могу получить доступ к методу findAll(). Я хочу автоматически подключить репозиторий внутри метода, потому что я заранее не знаю, какой JpaRepository я буду использовать (имя используемого репозитория я получаю из браузера в формате String).
Просто приведите bean-компонент к интерфейсу JPARepository
В основном лучше использовать некоторое перечисление для доступного имени модели, потому что в вашем подходе пользователь может получить любую незащищенную таблицу.
почему вы используете отражение, чтобы получить этот bean?