IntelliJ IDEA แสดงข้อผิดพลาดเมื่อใช้คำอธิบายประกอบ @Autowired ของ Spring


104

IntelliJ IDEA แสดงข้อผิดพลาดเมื่อฉันใช้@Autowiredคำอธิบายประกอบของ Spring ในคลาส แต่คลาสนั้นทำงานได้โดยไม่มีปัญหาใด ๆ

นี่คือข้อความแสดงข้อผิดพลาด:

ต้องกำหนดสมาชิกอัตโนมัติใน spring bean ที่ถูกต้อง (@ Component / @ Service ฯลฯ ) less ... (Ctrl + F1) ตรวจสอบปัญหาการเดินสายอัตโนมัติในคลาส bean


5
ลองใช้สิ่งนี้: @SuppressWarnings ("SpringJavaAutowiringInspection")
i-bob

ฉันมีข้อผิดพลาดเดียวกันสำหรับคลาสทดสอบการรวมของฉัน ฉันคิดว่าการใช้คำอธิบายประกอบ @SupressWarnings เป็นทางออกที่ดี
Kevin Wittek

Intellij 2016.2 กำลังทำสิ่งนี้กับโครงการข้อมูลสปริงบูต / สปริงของฉัน Intellij กำลังมองหาไฟล์ใดเพื่อยืนยันว่ามีถั่วอะไรอยู่
Adam

2
ฉันต้องใช้ @SuppressWarnings ("SpringJavaAutowiredMembersInspection")
user672009

3
สำหรับ IntelliJ IDEA 2017.3.1 (Ultimate Edition) ให้ใช้@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
lealceldeiro

คำตอบ:


33

ฉันมีปัญหาเดียวกันกับ IntelliJ IDEA 13.1.4 ฉันแก้ไขได้โดยการลบ Spring facet (File-> Project Structure) และปล่อยทิ้งไว้เพื่อแสดง "Detection"


36
แต่จะเกิดอะไรขึ้นถ้าคุณลืมใส่คำอธิบายประกอบถั่ว คุณจะไม่ได้รับคำเตือนใด ๆ ?
Cleankod

22

หากคุณรู้ว่ามีถั่วอยู่และเป็นเพียงปัญหาของการตรวจสอบให้เพิ่มสิ่งต่อไปนี้ก่อนการประกาศตัวแปร:

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

บางครั้ง IntelliJ ไม่สามารถแก้ไขได้หากมีการประกาศ bean เช่นเมื่อ bean ถูกรวมตามเงื่อนไขและการแก้ปัญหาเงื่อนไขเกิดขึ้นที่รันไทม์



19

มีข้อผิดพลาดเดียวกันที่นี่!

ดูเหมือนว่า Intellij จะไม่สามารถตรวจสอบได้ว่าการใช้งานคลาสเป็น @Service หรือ @Component

แก้ไขได้เพียงแค่เปลี่ยนจาก Error เป็น Warning (กด Alt + Enter)


18

ลบไฟล์. iml ออกจากโมดูลโปรเจ็กต์ทั้งหมดของคุณแล้วไปที่ File -> Invalidate Caches / Restart


9
การลบแง่มุมและการระงับคำเตือนหรือ "การแก้ไข" ที่คล้ายกันนั้นดูไม่สมเหตุสมผลหรือฉลาดดังนั้นฉันจึงลองดู แต่ฉันไม่ได้ทำขั้นตอนสุดท้ายเหมือนเดิม แต่ฉันลบ.imlไฟล์ของฉันเลือกที่จะนำเข้าอีกครั้งในตัวเลือก maven บนpom.xmlไฟล์และctrl + sทำการสร้างไฟล์.iml. ข้อผิดพลาดหายไป
ChiefTwoPencils


6

ผมมีปัญหาเหมือนกัน. ฉันแก้ไขโดยการเพิ่ม Spring facet (File-> Project Structure) สำหรับแต่ละโมดูลที่เกี่ยวข้องจากนั้นเพิ่มไฟล์คอนฟิกูเรชัน สำหรับบางโปรเจ็กต์ (spring mvc) ไฟล์กำหนดค่าที่ตรวจพบโดยอัตโนมัติ อย่างไรก็ตามสำหรับโครงการ jar ฉันต้องเพิ่มไฟล์การกำหนดค่าด้วยตนเอง


4

ตรวจสอบให้แน่ใจว่าคุณมีคำจำกัดความของ Spring bean ที่ถูกต้อง บางครั้งแอปพลิเคชันทำงานได้ดีเพียงแค่แสดงข้อผิดพลาดใน IDE ตรวจสอบไฟล์ "iml" ของโปรเจ็กต์หากคุณมี Spring facet ที่กำหนดไว้


ตรวจสอบ application-properties.xml ของคุณด้วย ตรวจสอบว่าบริบทบรรทัด: component-scan base-package =” com.my.project” ไม่รวมแพ็กเกจของบริการที่คุณอ้างถึง
i-bob

ฉันใส่รหัสของคุณใน "bec-job.iml" ของโปรเจ็กต์ของฉัน แต่ปัญหายังคงมีอยู่และฉันไม่พบชื่อไฟล์คือ "applicationContext-interface.xml" ในโปรเจ็กต์ของฉันคุณสามารถบอกรายละเอียดเกี่ยวกับเรื่องนี้ได้ไหม เหรอ?
Vainlyh

คุณต้องใส่ @SuppressWarnings ("SpringJavaAutowiringInspection") ไว้เหนือส่วน @Autowired ของโค้ดที่เป็นสีแดงสูง วิธีนี้ IntelliJIdea จะจดจำคำเตือนที่จะระงับ
i-bob

คุณต้องหาไฟล์ "application-properties.xml" ไม่ใช่ "applicationContext-interface.xml"
i-bob

1
@SuppressWarnings ("SpringJavaAutowiringInspection") ดูเหมือนจะแฮ็คสำหรับฉัน แต่ก็ใช้ได้ผล ขอบคุณเพื่อน.
Minras

3

แก้ไขปัญหาโดยไปที่ File >> Project Structure >> Facets จากนั้นเพิ่มไฟล์คอนฟิกูเรชันทั้งหมดลงใน Spring Facet หลังจากนั้นก็เริ่มตรวจพบไฟล์ที่มีถั่วอยู่และสามารถจัดเรียงปัญหาได้ IntelliJ การให้เช็คนี้มีค่ามากและไม่ควรปิด IMHO


ฉันไม่เห็นว่า Spring เป็นแง่มุมที่เป็นไปได้ คุณมี Intellij เวอร์ชันใด
jDub9

2

ดูเหมือนว่าปัญหาการมองเห็น - ตัวควบคุมหลักไม่เห็นส่วนประกอบที่คุณพยายามต่อสาย

พยายามเพิ่ม

@ComponentScan("path to respective Component") 

ไปยังตัวควบคุมหลัก


2

ตรวจสอบให้แน่ใจว่า IntelliJ Idea (IDE) ของคุณรับรู้ถึงการกำหนดค่าสปริงที่จำเป็นทั้งหมดที่โมดูลของคุณกำลังถูกตรวจสอบ

คุณสามารถตรวจสอบได้ภายใต้

ไฟล์> โครงสร้างโครงการ> โมดูล> [ชื่อโปรเจ็กต์ของคุณในแผงด้านขวา]> สปริง

บางครั้งเราจำเป็นต้องบอก IDE อย่างชัดเจนว่าการกำหนดค่าสปริงมาจากการพึ่งพา (jar ที่มีอยู่ในคลาสพา ธ โครงการของคุณ)


1
สิ่งนี้มีอยู่ในฉบับชุมชนหรือเป็นรุ่น Ultimate เท่านั้น?
Archimedes Trajano

1

ฉันมีปัญหาเดียวกัน ของฉันเป็นเพราะถั่วที่มีการอ้างอิงอัตโนมัติไม่ใช่ส่วนประกอบของ Spring (เป็น EJB) แต่มี SpringBeanAutowiringInterceptor Interceptor ที่อนุญาตให้ใช้การทำงานอัตโนมัติ ฉันคิดว่า Intellij ไม่ได้ใช้ความเป็นไปได้นี้ในการตรวจสอบการเดินสายอัตโนมัติ


1

ฉันก็มีปัญหานี้เหมือนกัน การทำalt+ enterแล้วขอให้รันใหม่หรือปิดการใช้งานการตรวจสอบสปริงในบรรทัดที่ได้รับผลแก้ไข ดูเหมือนว่าจะกลายเป็นปัญหาหลังจากการอัปเดต 13.4 เท่านั้น


1

ในกรณีของฉันฉันพลาดที่จะเขียนใน 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>

และในไฟล์บริบทของแอปพลิเคชัน:

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

หลังจากเพิ่มแท็กนี้และเรียกใช้ maven เพื่อสร้างโปรเจ็กต์ใหม่เกิดข้อผิดพลาดอัตโนมัติใน intellj desapears และไอคอน bean ปรากฏที่ขอบด้านซ้าย: ป้อนคำอธิบายภาพที่นี่


1

ของฉันไม่ได้เพิ่ม @Repository บนอินเทอร์เฟซ CrudRepository ของฉันบทช่วยสอนที่ฉันดูไม่ได้เพิ่มลงใน STS และมันก็ไม่บ่น


1

คุณควรตรวจสอบว่าคุณได้เพิ่ม @Component, @Repository หรือสิ่งที่คล้ายกันในคลาสหรือไม่



0
eg1:
director:Settings - 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

ฉันแก้ปัญหานี้ด้วยวิธีนี้แล้ว ใน IntelliJ แพ็กเกจทั้งหมดของคุณควรอยู่ในแพ็กเกจย่อยซึ่งเป็นแพ็กเกจย่อยของ main / java ตัวอย่างเช่นฉันได้ใส่แพ็คเกจทั้งหมดของฉันไว้ใน src / main / java / com.misisol.watchStore / และฤดูใบไม้ผลิสามารถหาถั่วของฉันได้หลังจากนั้น



0

ฉันมีปัญหาที่คล้ายกัน ฉันแก้ไขได้โดยยกเลิกการเลือกตัวเลือก "ประมวลผลถั่วที่ใส่คำอธิบายประกอบอย่างชัดเจน" (ดูภาพหน้าจอด้านล่าง) ตัวเลือกนี้ถูกเปิดใช้งานโดยค่าเริ่มต้นบน linux ตอนนี้คำอธิบายประกอบ @Service และ @Configurations สามารถมองเห็นได้ ภาพหน้าจอ


0

สายไปหน่อย แต่ฉันหวังว่ามันจะช่วยคนอื่นได้

อย่าลืมใส่ @Service ในคลาสการนำไปใช้งานสำหรับบริการ

@Service
public class ServiceNameImpl implements ServiceName {

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

}

นั่นคือวิธีที่ฉันแก้ไขข้อผิดพลาด


0

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันไม่พบคำตอบใด ๆ ที่ช่วยแก้ปัญหานี้ให้ฉันได้ดังนั้นฉันจะให้คำตอบ

หมายเหตุ: ผมคิดว่าปัญหาอาจจะได้รับนี้แต่ปัญหาของฉันก็ไม่ได้เกี่ยวข้องกับการดำเนินการติดต่อกันเป็นครั้งที่สอง การใช้@Qualitierทำให้ปัญหาของฉันหายไป แต่มันเป็นผ้าพันแผลและไม่ใช่วิธีแก้ปัญหาที่เหมาะสมดังนั้นฉันจึงไม่ได้จัดการกับสิ่งนั้น

พื้นหลัง

ฉันได้รับมอบหมายให้ดูแลโครงการเก่าที่ผ่านสปริงเวอร์ชันต่างๆและอัปเดตเฉพาะสำหรับโมดูลแยกต่างหากดังนั้นสิ่งที่จำเป็นต้องมีการปรับโครงสร้างใหม่อย่างน้อยที่สุด ในตอนแรกฉันได้รับปัญหา bean ที่ซ้ำกันและการแก้ไขกับสิ่งต่างๆได้เปลี่ยนปัญหาไปมาระหว่างปัญหาของ OP และปัญหาถั่วที่ซ้ำกันแม้ว่าจะมีเพียงถั่วเดียวก็ตาม การนำทางไปยังถั่วที่ซ้ำกันจะไปที่คลาสเดียวกันเสมอ

ปัญหา

ปัญหานี้มีอยู่ใน@Repositoryคลาสที่อยู่@Autowiredใน@Serviceคลาสซึ่งมี@ComponentScanคำอธิบายประกอบอยู่ด้วย ฉันสังเกตว่าฉันยังมีสปริงapplication-config.xmlที่ทำcontext:component-scanบนแพ็คเกจพื้นฐานซึ่งฉันเชื่อว่าเป็นแนวทางดั้งเดิมใน Spring เวอร์ชันเก่า ฉันอยู่ระหว่างการสร้างสาขาใหม่โดยนำส่วนของสาขาเก่าและสาขาที่ใหม่กว่ามาใช้ในโครงการสนับสนุนที่ใช้ในโครงการต่างๆที่ได้รับการพัฒนาในช่วงหลายปีที่ผ่านมาและนั่นคือสาเหตุที่มีการผสมผสานกันอย่างลงตัว วิธีการ

โซลูชันที่เรียบง่าย

เนื่องจากมีการนำแนวทางการใช้งานที่ทันสมัยกว่ามาใช้@ComponentScanแล้วฉันจึงนำออกapplication-config.xmlและปัญหาได้รับการแก้ไขแล้ว


0

สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน:

  1. ค้นหาคลาสทั้งหมดที่ใช้บริการ (อินเทอร์เฟซ) ซึ่งให้ข้อผิดพลาด
  2. ทำเครื่องหมายแต่ละชั้นเรียนด้วยคำอธิบายประกอบ @Service เพื่อระบุว่าเป็นคลาสตรรกะทางธุรกิจ
  3. สร้างโครงการใหม่

0

ฉันอาจจะสายนิดหน่อย แต่หลังจากใช้เวลาหลายชั่วโมงและค้นคว้าเกี่ยวกับปัญหานี้

ฉันพบว่าในIntelliJ 2020 @AutoWired เวอร์ชันล่าสุดนั้นเป็นทางเลือกและควรใช้การฉีดดีเปรสชันตามตัวสร้าง

ฉันแก้ปัญหาโดยการลบ@AutoWired Annotation จากคลาส Service and Controller และใช้การฉีดขึ้นต่อกันของตัวสร้าง

ลิงค์นี้อาจช่วยได้

Happy Coding!


0

ฉันมีปัญหานี้กับบริการเดียวที่มีการฉีดขึ้นต่อกันตามคอนสตรัคเตอร์กับ IntelliJ เวอร์ชัน 2019.2.4 ฉันพบว่าการเปลี่ยนชื่อบริการ (shift + f6) มีประโยชน์แล้วละทิ้งการเปลี่ยนแปลงจากระดับคอมไพล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.