IntelliJ IDEA hiển thị lỗi khi sử dụng chú thích @Autowntic của Spring


102

IntelliJ IDEA đang hiển thị lỗi khi tôi sử dụng @Autowiredchú thích của Spring trong lớp, nhưng lớp vẫn hoạt động mà không có vấn đề gì.

Đây là thông báo lỗi này:

Các thành viên tự động tạo phải được xác định trong spring bean hợp lệ (@ Component / @ Service, v.v.) less ... (Ctrl + F1) Kiểm tra các vấn đề tự động tạo trong một lớp bean.


5
hãy thử sử dụng cái này: @SuppressWarnings ("SpringJavaAutowiringInspection")
i-bob

Tôi gặp lỗi tương tự đối với các lớp kiểm tra tích hợp của mình. Tôi nghĩ rằng sử dụng chú thích @SupressWarnings là một giải pháp hay.
Kevin Wittek

Intellij 2016.2 đang thực hiện việc này với dự án khởi động mùa xuân / dữ liệu mùa xuân của tôi. Intellij đang xem xét tệp nào để xác định những hạt đậu tồn tại?
Adam

2
Tôi đã phải sử dụng @SuppressWarnings ("SpringJavaAutowosystemMembersInspection")
user672009,

3
Đối với IntelliJ IDEA 2017/03/01 (Ultimate Edition) sử dụng@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
lealceldeiro

Câu trả lời:


31

Tôi đã gặp vấn đề tương tự với IntelliJ IDEA 13.1.4 Tôi đã giải quyết nó bằng cách loại bỏ khía cạnh Spring (File-> Project Structure) và để nó chỉ hiển thị "Detection".


36
Nhưng điều gì sẽ xảy ra nếu bạn thực sự quên chú thích một hạt đậu. Bạn sẽ không nhận được bất kỳ cảnh báo nào?
Cleankod

22

Nếu bạn biết rằng bean tồn tại và nó chỉ là vấn đề của việc kiểm tra, thì chỉ cần thêm phần sau vào trước khai báo biến:

@SuppressWarnings("SpringJavaAutowiringInspection")
@Inject MyClass myVariable;

Đôi khi IntelliJ không thể giải quyết nếu một bean đã được khai báo, chẳng hạn như khi bean được đưa vào có điều kiện và việc phân giải điều kiện xảy ra trong thời gian chạy.


21

Tôi đã sửa nó bằng cách thêm cảnh báo supress:

 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
 @Autowired
 private ....

19

Có cùng một lỗi ở đây!

Có vẻ như Intellij không thể xác minh việc triển khai lớp là @Service hay @Component.

Giải quyết nó chỉ cần thay đổi từ Lỗi thành Cảnh báo (Nhấn Alt + Enter).


18

Xóa tệp .iml khỏi tất cả mô-đun dự án của bạn và tiếp theo đi tới Tệp -> Vô hiệu hóa bộ nhớ cache / Khởi động lại


9
Việc loại bỏ các khía cạnh và loại bỏ các cảnh báo hoặc các "bản sửa lỗi" tương tự có vẻ không hợp lý hoặc thông minh nên tôi đã thử điều này. Nhưng tôi đã không làm bước cuối cùng như vậy. Thay vào đó, tôi đã xóa .imltệp của mình , chọn nhập lại các tùy chọn maven trên pom.xmltệp và thực hiện ctrl + stái tạo .iml. Đã hết lỗi.
ChiefTwoPencils


5

Tôi đã từng gặp vấn đề tương tự. Tôi đã giải quyết nó bằng cách thêm khía cạnh Spring (Tệp-> Cấu trúc dự án) cho từng mô-đun có liên quan, sau đó thêm các tệp cấu hình. Đối với một số dự án (spring mvc), các tệp cấu hình được phát hiện tự động. Tuy nhiên, đối với một dự án jar, tôi phải thêm các tệp cấu hình theo cách thủ công.


4

Đảm bảo rằng bạn đã định nghĩa đúng về Spring bean của mình. Đôi khi, ứng dụng hoạt động tốt, nó chỉ hiển thị lỗi trong IDE, hãy kiểm tra tệp 'iml' dự án của bạn nếu bạn đã xác định khía cạnh Spring.


Đồng thời kiểm tra ứng dụng-thuộc tính.xml của bạn. Kiểm tra xem ngữ cảnh dòng: component-scan base-package = ”com.my.project” không loại trừ gói dịch vụ bạn đang tham chiếu.
i-bob

Tôi đã đặt mã của bạn vào "bec-job.iml" trong dự án của tôi, nhưng vấn đề vẫn tồn tại và tôi không thể tìm thấy tên tệp là "applicationContext-interface.xml" trong dự án của mình, bạn có thể cho biết chi tiết về nó không ?
Vainlyh

bạn phải đặt @SuppressWarnings ("SpringJavaAutowiringInspection") ngay phía trên phần @Autow mong muốn của mã có màu đỏ được đánh dấu cao. Bằng cách này, IntelliJIdea nhận ra cảnh báo nào cần loại bỏ.
i-bob

bạn phải tìm tệp "application-property.xml", không phải "applicationContext-interface.xml"
i-bob

1
@SuppressWarnings đó ("SpringJavaAutowiringInspection") có vẻ khó hiểu với tôi, nhưng nó hoạt động. Cảm ơn các bạn.
Minras

3

Giải quyết vấn đề bằng cách đi tới Tệp >> Cấu trúc dự án >> Các khía cạnh và sau đó thêm tất cả các tệp cấu hình vào Spring Facet. Sau đó, nó bắt đầu phát hiện các tệp chứa đậu và có thể sắp xếp vấn đề. IntelliJ đưa ra kiểm tra này khá có giá trị và IMHO không nên bị vô hiệu hóa.


Tôi không thấy mùa xuân là một khía cạnh khả dĩ. Bạn có phiên bản Intellij nào?
jDub9

2

Có vẻ như vấn đề về khả năng hiển thị - bộ điều khiển mẹ không nhìn thấy Thành phần mà bạn đang cố nối dây.

Cố gắng thêm

@ComponentScan("path to respective Component") 

tới bộ điều khiển mẹ.


2

Đảm bảo rằng IntelliJ Idea (IDE) của bạn biết tất cả các cấu hình lò xo cần thiết mà mô-đun của bạn đang được kiểm tra.

Bạn có thể kiểm tra điều này dưới

Tệp> Cấu trúc dự án> Mô-đun> [tên dự án của bạn trong bảng bên phải]> Mùa xuân

Đôi khi, chúng tôi cần phải nói rõ ràng với IDE rằng cấu hình mùa xuân đến từ một phụ thuộc (một jar hiện diện trong classpath dự án của bạn)


1
cái này có sẵn trên phiên bản cộng đồng hay chỉ trên phiên bản cuối cùng?
Archimedes Trajano

1

Tôi có cùng một vấn đề. Của tôi là bởi vì bean chứa tham chiếu tự động không phải là một thành phần Spring (nó là một EJB), nhưng có một SpringBeanAutowiringInterceptor Interceptor cho phép sử dụng tự động. Tôi nghĩ rằng Intellij không tính đến khả năng này trong quá trình kiểm tra Autowiring.


1

Tôi cũng có vấn đề này. Thực hiện alt+ entervà sau đó yêu cầu chạy lại hoặc tắt kiểm tra Spring trên dòng có hiệu lực đã khắc phục sự cố. Điều này dường như chỉ trở thành một vấn đề sau bản cập nhật 13.4.


1

trong trường hợp của tôi, tôi đã thiếu để viết trong web.xml:

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:applicationContext.xml</param-value>
   </context-param>

và trong tệp ngữ cảnh ứng dụng:

<context:component-scan base-package=[your package name] />

sau khi thêm thẻ này và chạy maven để xây dựng lại dự án, lỗi tự động tải trong intellj desapears và biểu tượng hạt đậu xuất hiện ở lề trái: nhập mô tả hình ảnh ở đây


1

Của tôi là không thêm @Repository trên giao diện CrudRepository của tôi, hướng dẫn tôi đang xem đã không thêm nó trên STS và nó không có gì phàn nàn.


1

Bạn nên kiểm tra xem bạn đã thêm @Component, @Repository hoặc tương tự vào lớp chưa



0
eg1:
directorSettings - Editor - Inspections - Spring - Spring Core - Code - Autowiring for Bean Class 
operate:checkout 勾去掉
eg2:
1.impl class add @service
like this:
@Service
public class CityServiceImpl implements CityService{
@Autowired
private CityDao cityDao;

like this
2.dao file class add @Repository
@Repository
public interface CityDao {

0

Tôi đã giải quyết vấn đề này theo cách này. Trong IntelliJ, tất cả các gói của bạn phải nằm trong một gói phụ là gói phụ của main / java. Ví dụ: tôi đã đặt tất cả các gói của mình dưới src / main / java / com.misisol.watchStore / và spring có thể tìm thấy bean của tôi sau đó.


0

Inject Bean với @Qualifier đã giải quyết được vấn đề cho tôi.


0

Tôi đã có vấn đề tương tự. Tôi đã giải quyết nó bằng cách bỏ chọn tùy chọn "Xử lý đậu được chú thích rõ ràng" (xem ảnh chụp màn hình bên dưới). Tùy chọn này được bật theo mặc định trên linux. Giờ đây, chú thích @Service và @Configurations đã hiển thị. ảnh chụp màn hình


0

hơi muộn nhưng tôi hy vọng nó sẽ giúp ích cho người khác.

Đảm bảo đặt @Service vào lớp triển khai cho dịch vụ

@Service
public class ServiceNameImpl implements ServiceName {

    @Override
    public void method(ObjectType paramName) {
        //CODE
    }

}

Đó là cách tôi sửa lỗi.


0

Tôi biết đây là một câu hỏi cũ, nhưng tôi chưa tìm thấy bất kỳ câu trả lời nào giải quyết được vấn đề này cho tôi, vì vậy tôi sẽ cung cấp giải pháp của mình.

Lưu ý: Tôi nghĩ vấn đề có thể là do điều này , nhưng vấn đề của tôi không liên quan đến việc triển khai cùng một giao diện hai lần. Việc sử dụng @Qualitierđã làm cho vấn đề của tôi biến mất, nhưng đó là một miếng băng và không phải là một giải pháp thích hợp nên tôi không giải quyết vấn đề đó.

LÝ LỊCH

Tôi được giao nhiệm vụ duy trì một dự án cũ đã trải qua các phiên bản khác nhau của mùa xuân và chỉ được cập nhật cho các mô-đun riêng biệt, vì vậy ít nhất mọi thứ cần phải cấu trúc lại. Ban đầu tôi đã nhận được vấn đề đậu trùng lặp và mày mò với những thứ đã thay đổi vấn đề qua lại giữa vấn đề của OP và vấn đề trùng lặp bean mặc dù chỉ có một bean; điều hướng đến các bean trùng lặp luôn đi cùng một lớp.

VẤN ĐỀ

Sự cố xuất hiện trên một @Repositorylớp nằm @Autowiredtrong một @Servicelớp cũng có @ComponentScanchú thích. Tôi nhận thấy rằng tôi cũng có một mùa xuân application-config.xmlđang thực hiện context:component-scantrên gói cơ sở, mà tôi tin rằng đó là cách tiếp cận ban đầu trong các phiên bản cũ hơn của Spring. Tôi đang trong quá trình tạo ra một chi nhánh mới bằng cách lấy các phần của một chi nhánh cũ và một chi nhánh mới hơn trong một dự án hỗ trợ được sử dụng trong các dự án khác nhau đã được phát triển trong vài năm và đó là lý do tại sao lại có sự kết hợp như vậy phương pháp luận.

GIẢI PHÁP ĐƠN GIẢN

Vì cách tiếp cận sử dụng hiện đại hơn @ComponentScanđã được triển khai, tôi chỉ cần gỡ bỏ application-config.xmlvà vấn đề đã được giải quyết.


0

Những điều sau đây đã làm việc cho tôi:

  1. Tìm tất cả các lớp triển khai dịch vụ (giao diện) đang gây ra lỗi.
  2. Đánh dấu từng lớp đó bằng chú thích @Service, để chỉ ra chúng là các lớp logic nghiệp vụ.
  3. Xây dựng lại dự án.

0

Tôi có thể đến muộn một chút, nhưng sau khi dành hàng giờ và nghiên cứu về vấn đề này.

Tôi phát hiện ra rằng trong phiên bản mới nhất IntelliJ 2020 @AutoWosystem là tùy chọn và khả năng tiêm suy giảm dựa trên phương thức xây dựng là phù hợp hơn.

Tôi đã giải quyết vấn đề bằng cách chỉ cần xóa @AutoWosystem Annotation khỏi lớp Dịch vụ và Bộ điều khiển và sử dụng chèn phụ thuộc dựa trên phương thức khởi tạo.

Liên kết này có thể hữu ích.

Chúc bạn mã hóa vui vẻ!


0

Tôi đã gặp sự cố này với chỉ một dịch vụ có chèn phụ thuộc vào phương thức khởi tạo với phiên bản 2019.2.4 của IntelliJ. Tôi thấy hữu ích khi thay đổi tên của dịch vụ (shift + f6) và sau đó loại bỏ các thay đổi từ cấp git.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.