intellij บอกไม่ถูกต้องว่าไม่พบชนิดของถั่วสำหรับที่เก็บอัตโนมัติ


148

ฉันได้สร้างการทดสอบหน่วยอย่างง่าย แต่ IntelliJ เน้นสีแดงไม่ถูกต้อง ทำเครื่องหมายว่าเป็นข้อผิดพลาด

ไม่มีถั่ว?

ป้อนคำอธิบายภาพที่นี่

ดังที่คุณเห็นด้านล่างผ่านการทดสอบหรือไม่? ดังนั้นจึงต้องเป็นแบบ Autowired?

ป้อนคำอธิบายภาพที่นี่


3
บางครั้ง IntelliJ ให้ข้อผิดพลาดอัตโนมัติที่เป็นบวกเท็จ ตัวอย่างเช่นในแอปพลิเคชัน Spring Boot ที่การกำหนดค่าจำนวนมากซ่อนอยู่หลัง EnableAutoConfiguration มีการเปิดประเด็นสำหรับสิ่งนั้น สาเหตุอื่น ๆ อาจมีการกำหนดค่า Spring facet ไม่ถูกต้อง สิ่งที่ฉันมักจะทำในสถานการณ์เหล่านี้คือการลดความรุนแรงของการตรวจสอบเพื่อให้มีสิ่งรบกวนน้อยลง ...
Bohuslav Burghardt

คำตอบ:


187

ฉันมีปัญหาเดียวกันนี้เมื่อสร้างแอปพลิเคชันSpring Bootโดยใช้@SpringBootApplicationคำอธิบายประกอบ คำอธิบายประกอบนี้แสดง@Configuration, @EnableAutoConfigurationและ@ComponentScanเป็นไปตามการอ้างอิงในฤดูใบไม้ผลิ

ตามที่คาดไว้คำอธิบายประกอบใหม่ทำงานได้อย่างถูกต้องและแอปพลิเคชันของฉันทำงานได้อย่างราบรื่น แต่Intellijยังคงบ่นเกี่ยวกับการ@Autowireอ้างอิงที่ไม่ได้ผล เร็วที่สุดเท่าที่ผมเปลี่ยนกลับไปใช้@Configuration, @EnableAutoConfigurationและ@ComponentScanแยกข้อผิดพลาดที่หยุด ดูเหมือนว่าIntellij 14.0.3 (และส่วนใหญ่จะเป็นเวอร์ชันก่อนหน้านี้ด้วย) ยังไม่ได้รับการกำหนดค่าให้จดจำ@SpringBootApplicationคำอธิบายประกอบ

ในตอนนี้หากข้อผิดพลาดรบกวนคุณมากขนาดนั้นให้เปลี่ยนกลับไปใช้คำอธิบายประกอบสามรายการที่แยกจากกัน มิฉะนั้นให้ละเว้นIntellij ... การแก้ปัญหาการอ้างอิงของคุณได้รับการกำหนดค่าอย่างถูกต้องเนื่องจากการทดสอบของคุณผ่านไป

จำไว้เสมอ ...

มนุษย์ยิ่งใหญ่กว่าเครื่องจักรเสมอ


1
ขณะนี้ปัญหาได้รับการแก้ไขแล้วด้วย Intellij เวอร์ชันใหม่กว่า (ตรวจสอบเมื่อ 2017.1)
Sourabh

46
ฉันยังคงได้รับมันในปี 2017.2 และเป็นการจ่ายสำหรับใบอนุญาตขั้นสูงสุด
Thomas Carlisle

1
ฉันได้รับมันด้วยคลาสชั้นนอก 2017.2 และ SprintBootTest และคลาสภายในแบบคงที่ SpringBootApplication ตามตัวอย่างการทดสอบ Spring Cloud Stream: docs.spring.io/spring-cloud-stream/docs/current/reference/html/…
danebez

5
สำหรับ IntelliJ เวอร์ชันล่าสุด (เช่น 2017) คุณต้องเปิดใช้งานปลั๊กอิน Spring Data จากนั้นคุณไม่จำเป็นต้องใช้วิธีแก้ปัญหาใด ๆ ข้างต้น มีคำตอบอื่นด้านล่างที่จะบอกวิธีการทำ
Norbert

4
ด้วย IntelliJ 2018.2 โดยใช้ Spring Boot 2.0.5 และ@SpringBootApplicationฉันได้รับข้อผิดพลาดนี้ ฉันทำตามคำแนะนำของ @ Jaõs Matos โดยใช้scanBasePackagesพารามิเตอร์เพื่อ@SpringBootApplicationและระบุแพ็กเกจ / เนมสเปซที่ควรสแกน
Dave Goodchild

56

เพิ่มคำอธิบายประกอบ Spring @Repositoryบนคลาสที่เก็บ

ฉันรู้ว่าควรใช้งานได้หากไม่มีคำอธิบายประกอบนี้ แต่ถ้าคุณเพิ่มสิ่งนี้ IntelliJ จะไม่แสดงข้อผิดพลาด

@Repository
public interface YourRepository ...
...

หากคุณใช้ Spring Data กับการขยายRepositoryคลาสมันจะมีการแบ่งเพจที่ขัดแย้งกัน จากนั้นคุณต้องระบุเพจที่มีความชัดเจน

import org.springframework.data.repository.Repository;
...

@org.springframework.stereotype.Repository
public interface YourRepository extends Repository<YourClass, Long> {
    ...
}

และถัดไปคุณสามารถกำหนดที่เก็บของคุณโดยอัตโนมัติโดยไม่มีข้อผิดพลาด

@Autowired
YourRepository yourRepository;

อาจไม่ใช่ทางออกที่ดี (ฉันเดาว่าคุณกำลังพยายามลงทะเบียน repositorium สองครั้ง) แต่ทำงานให้ฉันและอย่าแสดงข้อผิดพลาด

บางทีใน IntelliJ เวอร์ชันใหม่สามารถแก้ไขได้: https://youtrack.jetbrains.com/issue/IDEA-137023


3
ตามนี้youtrack.jetbrains.com/issue/IDEA-148113ได้รับการแก้ไขแล้วในเวอร์ชัน 16 ... (กลั้นหายใจ)
ismoore999

@ ส่วนประกอบก็ดูเหมือนจะทำงาน ดูเหมือนว่าจะต้องบังคับให้สแกนอินเทอร์เฟซ / คลาส
Brett

คุณไม่จำเป็นต้องเพิ่ม @Repository อีกต่อไป เพียงแค่ในปลั๊กอิน Spring Data
Shin Kim

4
สามปีต่อมาก็พังอีกครั้ง
garyM

ฉันใช้ / @ Mapper สำหรับอินเทอร์เฟซผู้ทำแผนที่ (mybatis) ไอเดียโยนคำเตือนนี้ ฉันเปลี่ยนเป็น / @ Repository คำเตือนหายไป
bzuo

35

IntelliJ IDEA Ultimate (2016.3.4 Build 163) เวอร์ชันของฉันดูเหมือนจะรองรับสิ่งนี้ เคล็ดลับคือคุณต้องเปิดใช้งานปลั๊กอิน Spring Data

ป้อนคำอธิบายภาพที่นี่


สิ่งนี้ได้แก้ไขปัญหาให้ฉันเช่นกัน - ดูเหมือนว่านี่อาจเป็นปัญหาที่แท้จริงสำหรับใครก็ตามที่มีการตั้งค่ารหัสอย่างถูกต้อง!
Matsu Q

5
ไม่ทำงานใน 2017.2.7 เปิดใช้งานปลั๊กอินแล้ว แต่ยังคงมีคำเตือนอยู่
brainfrozen

ทำงานให้ฉันใน iJ Ultimate 2018.2.5
JL_SO

ทำงานให้กับ Intellij idea ultimate 2020
praxnet

การอัปเกรดสิ่งนี้ทำได้อย่างมีเสน่ห์ใน Idea Ultimate 2020.2
สัมผัส

24

บางครั้งคุณต้องระบุว่า @ComponentScan ควรสแกนหาส่วนประกอบที่ใด คุณสามารถทำได้โดยส่งแพ็กเกจเป็นพารามิเตอร์ของคำอธิบายประกอบนี้เช่น:

@ComponentScan(basePackages={"path.to.my.components","path.to.my.othercomponents"})

อย่างไรก็ตามดังที่ได้กล่าวไปแล้วคำอธิบายประกอบ @SpringBootApplication จะแทนที่ @ComponentScan ดังนั้นในกรณีเช่นนี้คุณต้องทำเช่นเดียวกัน:

@SpringBootApplication(scanBasePackages={"path.to.my.components","path.to.my.othercomponents"})

อย่างน้อยก็ในกรณีของฉัน Intellij หยุดบ่น


2
นี่เป็นวิธีแก้ปัญหาที่ดีกว่าและสะอาดกว่าและสามารถยืนยันได้ว่าสิ่งนี้ลบคำเตือนออกไป ขอบคุณ!
Dave Goodchild

2
ในกรณีของฉันฉันมี@SpringBootApplication(scanBasePackages={"com.a.b, com.a.c"}) และแม้ว่าแอปจะทำงานได้ดี แต่ intellij ไม่ชอบ เปลี่ยนเป็น@SpringBootApplication(scanBasePackages={"com.a.b", "com.a.c"})แก้ไขให้ฉัน!
GriffoGoes

1
นี่เป็นทางออกที่ดีที่สุดเนื่องจากเป็นแบบพกพาระหว่าง IDE และสื่อสารเจตนาของนักพัฒนาอย่างชัดเจน
MusikPolice

ฉันใช้สุดยอด 2019.3.1 spring boot 2.2.1 และ java 11.0.4 ปัญหายังคงมีอยู่ในไฟล์ทดสอบหน่วย
garyM

1
สิ่งที่ @GriffoGoes แนะนำให้แก้ไขปัญหาของฉันเนื่องจากฉันใช้โครงสร้างหลายโมดูลนั่นคือทางออกที่ดีที่สุดของฉัน
Juan Monsalve

21

ฉันมักจะแก้ปัญหานี้โดยทำตาม .. การตั้งค่า> การตรวจสอบ> Spring Core> รหัสกว่าที่คุณเปลี่ยนจากข้อผิดพลาดเป็นการเตือนตัวเลือกความรุนแรง

ป้อนคำอธิบายภาพที่นี่


2
ฉันใช้วิธีแก้ปัญหานี้จนกว่าจะมีการแก้ไขใน Spring: youtrack.jetbrains.com/issue/IDEA-182912
Garry Polley

17

ฉันใช้ spring-boot 2.0 และ intellij 2018.1.1 ultimate edition และฉันประสบปัญหาเดียวกัน

ฉันแก้ไขโดยวาง @EnableAutoConfiguration ในคลาสแอปพลิเคชันหลัก

@SpringBootApplication
@EnableAutoConfiguration
class App{
/**/
}

15
สิ่งนี้ "ใช้ได้ผล" สำหรับฉันเช่นกัน แต่ intellij บ่นว่า: Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration ¯ \ _ (ツ) _ / ¯
Michael

6

ตรวจสอบว่าคุณพลาดคำอธิบายประกอบ @Service ในคลาสบริการของคุณหรือไม่นั่นเป็นกรณีของฉัน


5

การใส่@Componentหรือ@configurationในไฟล์ config bean ของคุณดูเหมือนจะใช้งานได้เช่น:

@Configuration
public class MyApplicationContext {
    @Bean
    public DirectoryScanner scanner() {
        return new WatchServiceDirectoryScanner("/tmp/myDir");
    }
}

@Component
public class MyApplicationContext {
    @Bean
    public DirectoryScanner scanner() {
        return new WatchServiceDirectoryScanner("/tmp/myDir");
    }
}

5

กำหนดค่าบริบทของแอปพลิเคชันและทั้งหมดจะเรียบร้อย

ป้อนคำอธิบายภาพที่นี่


ฉันมีบริการในโครงการหลายโมดูลการเพิ่ม Spring Application Context ในโมดูลที่เป็นปัญหาได้แก้ไขปัญหาแล้ว
Vadym Tyemirov

ฉันคิดว่าในกรณีของฉันปัญหาคือฉันมีคำอธิบายประกอบ @SpringBootApplication สองรายการในหนึ่งโปรเจ็กต์ (อันหนึ่งสำหรับดาทาโลเดอร์และอีกอันสำหรับโปรเจ็กต์จริง) ฉันทำตามคำแนะนำของคุณและกำหนดบริบทแอปพลิเคชันที่แตกต่างกันสองแบบอย่างชัดเจนตามที่คุณแสดงในภาพหน้าจอของคุณจากนั้นข้อผิดพลาดก็หายไป ขอบคุณ!
Simon

4

หากคุณไม่ต้องการเปลี่ยนแปลงรหัสของคุณเพียงเพื่อให้ IDE ของคุณมีความสุข ฉันได้แก้ไขโดยการเพิ่มส่วนประกอบทั้งหมดลงในด้าน Spring

  1. สร้างกลุ่มด้วยชื่อ "บริการโปรเซสเซอร์และเราเตอร์" หรือชื่อใดก็ได้ที่คุณต้องการ
  2. ลบและสร้าง "Spring Application Context" ใหม่โดยใช้กลุ่มที่คุณสร้างไว้ก่อนหน้านี้เป็นพาเรนต์

ป้อนคำอธิบายภาพที่นี่


4

ตราบใดที่การทดสอบของคุณผ่านคุณยังทำได้ดีให้กดalt + enterเคอร์เซอร์เหนือข้อผิดพลาดและในเมนูย่อยของรายการแรกคุณจะพบDisable Inspectionว่า


ขอบคุณ. มีวิธีดูการเปลี่ยนแปลงทั้งหมดที่ทำขึ้นซึ่งไม่ใช่ค่าเริ่มต้นในมุมมองเดียวในการตั้งค่า IntelliJ (เพื่อให้คุณรู้ว่าคุณเปลี่ยนแปลงอะไรไปบ้าง)?
powder366

3

ฉันมีปัญหาคล้ายกันในแอปพลิเคชัน Spring Boot แอปพลิเคชันใช้ Feign (ไคลเอนต์ HTTP ที่ร้องขอการสังเคราะห์จากอินเทอร์เฟซที่มีคำอธิบายประกอบ) การมีอินเทอร์เฟซที่มีSomeClientคำอธิบายประกอบ@FeignClientFeign จะสร้างคลาสพร็อกซีรันไทม์โดยใช้อินเทอร์เฟซนี้ เมื่อส่วนประกอบ Spring บางส่วนพยายามที่จะกำหนดประเภทของ bean SomeClientโดยอัตโนมัติ Idea บ่นว่าไม่SomeClientพบประเภท bean เนื่องจากไม่มีคลาสจริงอยู่ในโครงการและ Idea ไม่ได้รับการสอนให้เข้าใจ@FeignClientคำอธิบายประกอบ แต่อย่างใด

วิธีแก้ไข: ใส่คำอธิบายประกอบอินเทอร์เฟซSomeClientด้วย@Component. (ในกรณีของเราเราไม่ได้ใช้@FeignClientคำอธิบายประกอบSomeClientโดยตรงเราค่อนข้างใช้ metaannotation @OurProjectFeignClientซึ่งมีคำอธิบายประกอบ@FeignClientและการเพิ่ม@Componentคำอธิบายประกอบเข้าไปก็ใช้ได้เช่นกัน)


ใช่การเพิ่ม@Componentลงในอินเทอร์เฟซช่วยแก้ปัญหาได้ แต่ฉันคิดว่านี่ไม่ใช่วิธีที่ถูกต้อง ... ในความคิดของฉันนี่เป็นข้อผิดพลาดใน IntelliJ IDEA หรือไม่ยาก IntelliJ IDEA ยังไม่พร้อมสำหรับ Feign เวอร์ชันที่ใหม่กว่า ใช้งานได้โดยไม่ต้อง@Componentใช้เวอร์ชันปลอมที่ผิดพลาด (ซึ่งมี@FeignClientคำอธิบายประกอบอยู่org.springframework.cloud.netflix.feignแทนorg.springframework.cloud.openfeign- นี่อาจเป็นสาเหตุของปัญหาหรือไม่) คุณพบรายละเอียดเพิ่มเติม (อาจเป็นตั๋วข้อผิดพลาด) สำหรับสิ่งนี้หรือไม่?
Josef Reichardt

ไม่ฉันไม่ได้แม้ว่ากรณีของฉัน (ซึ่งไม่ได้ผลถ้าไม่มี@Component) @FeignClientมาจากorg.springframework.cloud.netflix.feign) แพ็คเกจ
TomášZáluský

3
ปัญหาที่ตัวติดตามข้อบกพร่องของ JetBrains อยู่ที่นี่: youtrack.jetbrains.com/issue/IDEA-168155
Josef Reichardt

3

สำหรับฉันวิธีแก้ปัญหาคือการวาง@EnableAutoConfigurationในคลาส Application ภายใต้@SpringBootApplicationมันจะขีดเส้นใต้เพราะมันซ้ำซ้อน ลบมันและคำเตือนทั้งหมดเกี่ยวกับถั่วที่หายไปจะหายไป! ฤดูใบไม้ผลิโง่ ...


2

และข้อมูลสำคัญชิ้นสุดท้าย - เพิ่มข้อมูลComponentScanเพื่อให้แอปทราบเกี่ยวกับสิ่งที่ต้องเชื่อมต่อ สิ่งนี้ไม่เกี่ยวข้องในกรณีของคำถามนี้ อย่างไรก็ตามหากไม่มี@autowiringการดำเนินการเลยนี่อาจเป็นวิธีแก้ปัญหาของคุณ

@Configuration
@ComponentScan(basePackages = {
    "some_package",
})
public class someService {

สิ่งนี้สมเหตุสมผลและเป็นเคล็ดลับสำหรับฉัน ทำไมต้องปิดคำเตือน? คำเตือนควรทำงานตามที่คาดไว้!
WebComer

2

สิ่งที่คุณต้องทำคือเพิ่ม

@ComponentScan("package/include/your/annotation/component") ในAppConfiguration.java.

เนื่องจากฉันคิดว่าAppConfiguraion.javaแพคเกจของคุณลึกกว่าส่วนประกอบคำอธิบายประกอบของคุณ (@Service, @Component ... )

เช่น"package/include/your/annotation/component/deeper/config".


@ComponentScan ("package.include.your.annotation.component")!
Iakov Senatov

2

ฉันมีปัญหาคล้ายกันในแอปพลิเคชันของฉัน เมื่อฉันเพิ่มคำอธิบายประกอบการไฮไลต์ที่ไม่ถูกต้องหายไป

@ContextConfiguration(classes = {...})

สำหรับแพ็คเกจทดสอบเท่านั้น!
Iakov Senatov

2

ฉันใช้คำอธิบายประกอบนี้เพื่อซ่อนข้อผิดพลาดนี้เมื่อปรากฏใน IntelliJ v.14:

@SuppressWarnings("SpringJavaAutowiringInspection")

เมื่อออโต้เข้าสู่ตัวสร้างมันคือ@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
ลอเรน

2

ในกรณีของฉันไดเรกทอรีที่ฉันพยายาม @Autowired ไม่ได้อยู่ในระดับเดียวกัน

หลังจากตั้งค่าในระดับโครงสร้างเดียวกันข้อผิดพลาดก็หายไป

หวังว่าจะช่วยได้บ้าง!


2

ใช้@EnableAutoConfigurationคำอธิบายประกอบ@Componentในระดับชั้นเรียน มันจะแก้ไขปัญหานี้

ตัวอย่างเช่น:

@Component
@EnableAutoConfiguration  
public class ItemDataInitializer  {

    @Autowired
    private ItemReactiveRepository itemReactiveRepository;

    @Autowired
    private MongoOperations mongoOperations;
}

1

วิธีแก้ปัญหาของฉันในแอปพลิเคชัน spring boot คือเปิดบริบทแอปพลิเคชัน spring และเพิ่มคลาสสำหรับถั่วอัตโนมัติที่หายไปด้วยตนเอง!

(เข้าถึงผ่านเมนู Project Structure หรือหน้าต่างเครื่องมือสปริง ... แก้ไข "Spring Application Context")

ดังนั้นแทนที่จะเป็น SpringApplicationContext เพียงแค่มีการกำหนดค่าสปริง ExampleApplication ของฉันมันยังมี Bean ที่หายไป:

SpringApplicationContext:

  • ExampleApplication.java
  • MissingBeanClass.java

et voilà: ข้อความแสดงข้อผิดพลาดหายไป!


1

ดูเหมือนว่าจะยังคงเป็นบั๊กใน IntelliJ ล่าสุดและเกี่ยวข้องกับปัญหาการแคชที่เป็นไปได้หรือไม่?

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


1

บางครั้ง - ในกรณีของฉันนั่นคือ - เหตุผลคือการนำเข้าที่ไม่ถูกต้อง ผมนำเข้าโดยบังเอิญ

import org.jvnet.hk2.annotations.Service

แทน

import org.springframework.stereotype.Service

โดยการยอมรับตัวเลือกแรกแบบสุ่มสี่สุ่มห้าในการนำเข้าที่แนะนำของ Idea ใช้เวลาสองสามนาทีในครั้งแรกที่เกิดขึ้น :-)


1

สิ่งที่คุณต้องทำเพื่อให้งานนี้มีรหัสต่อไปนี้:

@ComponentScan
public class PriceWatchTest{

    @Autowired
    private PriceWatchJpaRepository priceWatchJpaRepository;
...
...
}

1

ฉันต้องใช้ @EnableAutoConfiguration เพื่อจัดการกับมันอย่างไรก็ตามข้อผิดพลาดนี้ไม่มีผลกระทบต่อการทำงาน



1

IntelliJ IDEA Ultimate

เพิ่มคลาสหลักของคุณใน IntelliJ Spring Application Context ตัวอย่างเช่น Application.java

File -> Project Structure..

ด้านซ้าย: การตั้งค่าโครงการ -> โมดูล

ด้านขวา: ค้นหาในโครงสร้างแพ็คเกจของคุณ Springและเพิ่ม+ Application.java


มันเท่ากับคำตอบ UV
Anton Bondarenko

1

คุณได้ตรวจสอบว่าคุณได้ใช้@servicesคำอธิบายประกอบกับการใช้บริการของคุณหรือไม่? มันได้ผลสำหรับฉัน

import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserServices {}

1

ง่ายๆคุณต้องทำ 2 ขั้นตอน

  1. เพิ่มการพึ่งพา hibernate-core
  2. เปลี่ยน@Autowiredเป็น@Resource.
==>> change @Autowired to  @Resource

อธิบายคำตอบของคุณ.
mentallurg

0

น่าแปลกที่โปรเจ็กต์ที่มุ่งเน้น Feign ซึ่งรันด้วย Eclipse ไม่สามารถรันใน InteliJ ได้ เมื่อเริ่มแอปพลิเคชัน InteliJ บ่นเกี่ยวกับไคลเอนต์ Feign ที่ฉันพยายามฉีดไปที่เลเยอร์ serviceImpl โดยกล่าวว่า: field personRestClient (ไคลเอนต์ Feign ของฉัน) ใน ... ต้องใช้ bean ชนิด ... ที่ไม่พบ พิจารณากำหนดชนิดของ bean ".... " ในการกำหนดค่าของคุณ

ฉันเสียเวลานานมากในการพยายามทำความเข้าใจว่าอะไรคือสิ่งที่ผิด ฉันพบวิธีแก้ปัญหา (สำหรับ InteliJ) ซึ่งฉันไม่เข้าใจอย่างสมบูรณ์:

  1. Alt Shift F10 (หรือเรียกใช้เมนู)
  2. เลือก 'แก้ไขการกำหนดค่า'
  3. ในหน้าต่างการกำหนดค่าให้เลือกช่องทำเครื่องหมาย "รวมการอ้างอิงด้วย" ขอบเขตที่ระบุ "
  4. เรียกใช้แอปพลิเคชันของคุณ

หรือเลือก Eclipse :)


0

ตรวจสอบว่าบรรจุภัณฑ์ของถั่วของคุณเขียนถูกต้องหรือไม่

//Check if this is written right 
package com.package1.package2.package3


import ...

@Service
class ServiceX {

  ...

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