Я использую Spring Data Jpa, это структура моего проекта:
App
ConfigPackage
MyConfig
ServicePackage
MyService
RepositoryPackage
MyRepository
Вот MyRepository:
public interface MyRepository extends JpaRepository<MyEntity, Long> {
}
Вот MyService:
@Service
public class MyService {
@Autowired
private MyRepository myRepository; <---here
...
}
Вот MyConfig:
@Configuration
@EnableJpaRepositories(
basePackages = "RepositoryPackage",
entityManagerFactoryRef = "xxx",
transactionManagerRef = "xxx"
)
public class MyConfig {
}
Я использую @Autowired для внедрения MyRepository в MyService, но IntelliJ всегда жалуется
Could not autowire. No beans of 'MyRepository' type found
даже если код может компилироваться и успешно работать.
Почему IntelliJ не может распознать, что это не ошибка? Как убрать предупреждение IntelliJ?
Версия IntelliJ: 2018.2.6
Проблема решена этим stackoverflow.com/a/42025703/6690200




Вы можете объявить:
@SuppressWarnings("SpringJavaAutowiringInspection")
В поле или подавите предупреждение с помощью проверки кода Intellij (щелкните красную лампочку, и вы можете подавить «Автоматическое подключение для класса компонентов» либо для поля, либо для всего класса.
Где я должен разместить эту аннотацию?
Поместите его над полем. Это должно работать так же хорошо, если вы поместите его поверх класса, но тогда вы будете подавлять предупреждения для всех полей.
Я пробовал оба .. Не повезло ... Тем не менее предупреждение.
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Note this is for IntelliJ IDEA 2018.3.3 Ultimate Edition (But should work for other versions too)
Я заметил, что эти ошибки возникают (по крайней мере, в моих проектах), когда конфигурация использует @ComponentScan и, таким образом, загружает другой класс, аннотированный @Configuration. IntelliJ, похоже, не полностью распознает это, что приводит к ошибке/предупреждению:
xRepositoryСпасибо, я попробую. Я не могу понять, почему IntelliJ ошибочно принимает это за ошибку.
Не повезло, все равно предупреждает...
@竹杖芒鞋轻胜马 Предоставляет ли меню [alt] + [enter] какие-либо решения? Вы также можете игнорировать эти предупреждения, выбрав Настройки > редактор > Инспекции и отключив их.
Да, это позволило мне добавить @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection"), и предупреждения исчезли. Я не знаю почему...
Добавление @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") решило проблему. Но когда я погуглил SpringJavaInjectionPointsAutowiringInspection, я не нашел ни одного документа или официальных документов...
@竹杖芒鞋轻胜马 Я также нашел этот вопрос: stackoverflow.com/questions/21323309/…, что происходит, когда вы удаляете пружинный аспект в конфигурации вашего проекта и позволяете IntelliJ обнаружить его?
Предупреждение исчезает после удаления аспекта Spring. Хотя, я боюсь, это создаст еще одну проблему, даже если я удалю аннотации для других классов, таких как @Service, IntelliJ теперь не сможет его обнаружить, поэтому это может отключить всю функцию обнаружения IntelliJ...
@竹杖芒鞋轻胜马 Попробуйте нажать [Сборка], а затем [Перестроить проект] на верхней панели, это иногда заставляет IntelliJ сканировать все, и, как говорится, просто полностью перестройте свой проект.
Кажется, здесь есть решение stackoverflow.com/a/42025703/6690200
Решение, которое я использовал раньше, использовать @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection"), было предложено IntelliJ после того, как я вошел в [alt] + [enter]. Это работает, но я не буду его использовать, потому что не хочу импортировать эту аннотацию. Я включу плагин spring data, как сказал другой ответ.
В конфигурации вашей базы данных вы должны объявить свои базовые пакеты:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "postgreEntityManager",
transactionManagerRef = "postgreTransactionManager",
basePackages = "fr.lab.test.dao"
)
public class PostGreDBConfig {
Спасибо за ответ. Я сделал это, но все же предупреждение...
Попробуй :
@Configuration
@ComponentScan(basePackages = {"your repository package}")
Я уже делал это в MyConfig.
Возможно, у Intellij есть проблемы с именем вашего пакета в аннотации @EnableJpaRepositories. Можете ли вы попробовать поместить эту аннотацию в свой основной класс Spring без определения какого-либо свойства basePackages?
@EnableJpaRepositories(entityManagerFactoryRef = "xxx", transactionManagerRef = "xxx")
@SpringBootApplication
public class FooApplication {
public static void main(String[] args) {
SpringApplication.run(FooApplication.class, args);
}
}
Конечно, ваш основной класс Spring должен быть в корне;
root
ServicePackage
MyService
RepositoryPackage
MyRepository
FooApplication <---- main class here
Спасибо за ответ. Использование @Repository может устранить предупреждение, но JpaRepository — это NoRepositoryBean. Я думаю, что это не должно быть аннотировано @Repository. Мой основной класс — App, поэтому я полагаю, что класс репозитория должен быть просканирован.
@竹杖芒鞋轻胜马 тогда вы можете поместить @EnableJpaRepositories в класс App? Без свойства basePackages? Это разрешит, я надеюсь!
Вроде не помогает
@竹杖芒鞋轻胜马 Как насчет добавления аспекта в ваш проект? Из меню Project Structure перейдите в свой проект/модуль и добавьте фасет JPA? пример
Спасибо, сэр, я уже сделал это. Но IntelliJ, похоже, просто не может его распознать.
@竹杖芒鞋轻胜马 действительно интересно... Возможно, у вашего интеллекта возникли проблемы, вы пытались выполнить шаги здесь ? В противном случае у меня нет другой идеи, к сожалению :'(
Еще раз спасибо. Я попробую это завтра.
@竹杖芒鞋轻胜马 У меня есть один вопрос: когда вы вводите методы в репозиторий, Intellij завершает их? Например, когда вы набираете findBy, он дает предложения?
Да, это дает мне автозаполнение. Поэтому я почти уверен, что IntelliJ может сканировать репозиторий. И предупреждение не вредит, просто я не люблю предупреждения.
@竹杖芒鞋轻胜马 да, я понимаю, у меня был именно такой случай, никаких проблем, но надоедливые предупреждения, хотя не знаю, что их остановило...
@竹杖芒鞋轻胜马 использовать автопроводку через конструкторы? Я думаю, что это заставит эти предупреждения исчезнуть, просто следуйте это Это то, что я сделал, я думаю, что удалил предупреждения.
Да, я автомонтирую через конструкторы... Хотя предупреждение показывает, вводится ли инъекция в файл или в конструктор..
У меня была такая же проблема однажды, но просто измените структуру проекта и переместите свой MyRepository в тот же пакет, где у вас есть служба. Это должно работать. Я не знаю, почему это происходит.
Я вижу, что вы правильно используете аннотацию @Service, но используете ли вы аннотацию @Repository для своего класса репозитория? Без этой аннотации вы увидите ошибку при попытке «@Autowire». Это может быть полезно, так как я не вижу, где находится ваш основной класс SpringBootApplication: stackoverflow.com/questions/29221645/…