ฉันได้สร้างการทดสอบหน่วยอย่างง่าย แต่ IntelliJ เน้นสีแดงไม่ถูกต้อง ทำเครื่องหมายว่าเป็นข้อผิดพลาด
ไม่มีถั่ว?
ดังที่คุณเห็นด้านล่างผ่านการทดสอบหรือไม่? ดังนั้นจึงต้องเป็นแบบ Autowired?
ฉันได้สร้างการทดสอบหน่วยอย่างง่าย แต่ IntelliJ เน้นสีแดงไม่ถูกต้อง ทำเครื่องหมายว่าเป็นข้อผิดพลาด
ไม่มีถั่ว?
ดังที่คุณเห็นด้านล่างผ่านการทดสอบหรือไม่? ดังนั้นจึงต้องเป็นแบบ Autowired?
คำตอบ:
ฉันมีปัญหาเดียวกันนี้เมื่อสร้างแอปพลิเคชันSpring Bootโดยใช้@SpringBootApplication
คำอธิบายประกอบ คำอธิบายประกอบนี้แสดง@Configuration
, @EnableAutoConfiguration
และ@ComponentScan
เป็นไปตามการอ้างอิงในฤดูใบไม้ผลิ
ตามที่คาดไว้คำอธิบายประกอบใหม่ทำงานได้อย่างถูกต้องและแอปพลิเคชันของฉันทำงานได้อย่างราบรื่น แต่Intellijยังคงบ่นเกี่ยวกับการ@Autowire
อ้างอิงที่ไม่ได้ผล เร็วที่สุดเท่าที่ผมเปลี่ยนกลับไปใช้@Configuration
, @EnableAutoConfiguration
และ@ComponentScan
แยกข้อผิดพลาดที่หยุด ดูเหมือนว่าIntellij 14.0.3 (และส่วนใหญ่จะเป็นเวอร์ชันก่อนหน้านี้ด้วย) ยังไม่ได้รับการกำหนดค่าให้จดจำ@SpringBootApplication
คำอธิบายประกอบ
ในตอนนี้หากข้อผิดพลาดรบกวนคุณมากขนาดนั้นให้เปลี่ยนกลับไปใช้คำอธิบายประกอบสามรายการที่แยกจากกัน มิฉะนั้นให้ละเว้นIntellij ... การแก้ปัญหาการอ้างอิงของคุณได้รับการกำหนดค่าอย่างถูกต้องเนื่องจากการทดสอบของคุณผ่านไป
จำไว้เสมอ ...
มนุษย์ยิ่งใหญ่กว่าเครื่องจักรเสมอ
@SpringBootApplication
ฉันได้รับข้อผิดพลาดนี้ ฉันทำตามคำแนะนำของ @ Jaõs Matos โดยใช้scanBasePackages
พารามิเตอร์เพื่อ@SpringBootApplication
และระบุแพ็กเกจ / เนมสเปซที่ควรสแกน
เพิ่มคำอธิบายประกอบ 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
บางครั้งคุณต้องระบุว่า @ComponentScan ควรสแกนหาส่วนประกอบที่ใด คุณสามารถทำได้โดยส่งแพ็กเกจเป็นพารามิเตอร์ของคำอธิบายประกอบนี้เช่น:
@ComponentScan(basePackages={"path.to.my.components","path.to.my.othercomponents"})
อย่างไรก็ตามดังที่ได้กล่าวไปแล้วคำอธิบายประกอบ @SpringBootApplication จะแทนที่ @ComponentScan ดังนั้นในกรณีเช่นนี้คุณต้องทำเช่นเดียวกัน:
@SpringBootApplication(scanBasePackages={"path.to.my.components","path.to.my.othercomponents"})
อย่างน้อยก็ในกรณีของฉัน Intellij หยุดบ่น
@SpringBootApplication(scanBasePackages={"com.a.b, com.a.c"})
และแม้ว่าแอปจะทำงานได้ดี แต่ intellij ไม่ชอบ เปลี่ยนเป็น@SpringBootApplication(scanBasePackages={"com.a.b", "com.a.c"})
แก้ไขให้ฉัน!
ฉันใช้ spring-boot 2.0 และ intellij 2018.1.1 ultimate edition และฉันประสบปัญหาเดียวกัน
ฉันแก้ไขโดยวาง @EnableAutoConfiguration ในคลาสแอปพลิเคชันหลัก
@SpringBootApplication
@EnableAutoConfiguration
class App{
/**/
}
Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration
¯ \ _ (ツ) _ / ¯
ตรวจสอบว่าคุณพลาดคำอธิบายประกอบ @Service ในคลาสบริการของคุณหรือไม่นั่นเป็นกรณีของฉัน
การใส่@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");
}
}
ตราบใดที่การทดสอบของคุณผ่านคุณยังทำได้ดีให้กดalt + enter
เคอร์เซอร์เหนือข้อผิดพลาดและในเมนูย่อยของรายการแรกคุณจะพบDisable Inspection
ว่า
ฉันมีปัญหาคล้ายกันในแอปพลิเคชัน Spring Boot แอปพลิเคชันใช้ Feign (ไคลเอนต์ HTTP ที่ร้องขอการสังเคราะห์จากอินเทอร์เฟซที่มีคำอธิบายประกอบ) การมีอินเทอร์เฟซที่มีSomeClient
คำอธิบายประกอบ@FeignClient
Feign จะสร้างคลาสพร็อกซีรันไทม์โดยใช้อินเทอร์เฟซนี้ เมื่อส่วนประกอบ 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
- นี่อาจเป็นสาเหตุของปัญหาหรือไม่) คุณพบรายละเอียดเพิ่มเติม (อาจเป็นตั๋วข้อผิดพลาด) สำหรับสิ่งนี้หรือไม่?
@Component
) @FeignClient
มาจากorg.springframework.cloud.netflix.feign
) แพ็คเกจ
สำหรับฉันวิธีแก้ปัญหาคือการวาง@EnableAutoConfiguration
ในคลาส Application ภายใต้@SpringBootApplication
มันจะขีดเส้นใต้เพราะมันซ้ำซ้อน ลบมันและคำเตือนทั้งหมดเกี่ยวกับถั่วที่หายไปจะหายไป! ฤดูใบไม้ผลิโง่ ...
และข้อมูลสำคัญชิ้นสุดท้าย - เพิ่มข้อมูลComponentScan
เพื่อให้แอปทราบเกี่ยวกับสิ่งที่ต้องเชื่อมต่อ สิ่งนี้ไม่เกี่ยวข้องในกรณีของคำถามนี้ อย่างไรก็ตามหากไม่มี@autowiring
การดำเนินการเลยนี่อาจเป็นวิธีแก้ปัญหาของคุณ
@Configuration
@ComponentScan(basePackages = {
"some_package",
})
public class someService {
สิ่งที่คุณต้องทำคือเพิ่ม
@ComponentScan("package/include/your/annotation/component")
ในAppConfiguration.java
.
เนื่องจากฉันคิดว่าAppConfiguraion.java
แพคเกจของคุณลึกกว่าส่วนประกอบคำอธิบายประกอบของคุณ (@Service, @Component ... )
เช่น"package/include/your/annotation/component/deeper/config"
.
ฉันมีปัญหาคล้ายกันในแอปพลิเคชันของฉัน เมื่อฉันเพิ่มคำอธิบายประกอบการไฮไลต์ที่ไม่ถูกต้องหายไป
@ContextConfiguration(classes = {...})
ฉันใช้คำอธิบายประกอบนี้เพื่อซ่อนข้อผิดพลาดนี้เมื่อปรากฏใน IntelliJ v.14:
@SuppressWarnings("SpringJavaAutowiringInspection")
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
ในกรณีของฉันไดเรกทอรีที่ฉันพยายาม @Autowired ไม่ได้อยู่ในระดับเดียวกัน
หลังจากตั้งค่าในระดับโครงสร้างเดียวกันข้อผิดพลาดก็หายไป
หวังว่าจะช่วยได้บ้าง!
ใช้@EnableAutoConfiguration
คำอธิบายประกอบ@Component
ในระดับชั้นเรียน มันจะแก้ไขปัญหานี้
ตัวอย่างเช่น:
@Component
@EnableAutoConfiguration
public class ItemDataInitializer {
@Autowired
private ItemReactiveRepository itemReactiveRepository;
@Autowired
private MongoOperations mongoOperations;
}
วิธีแก้ปัญหาของฉันในแอปพลิเคชัน spring boot คือเปิดบริบทแอปพลิเคชัน spring และเพิ่มคลาสสำหรับถั่วอัตโนมัติที่หายไปด้วยตนเอง!
(เข้าถึงผ่านเมนู Project Structure หรือหน้าต่างเครื่องมือสปริง ... แก้ไข "Spring Application Context")
ดังนั้นแทนที่จะเป็น SpringApplicationContext เพียงแค่มีการกำหนดค่าสปริง ExampleApplication ของฉันมันยังมี Bean ที่หายไป:
SpringApplicationContext:
et voilà: ข้อความแสดงข้อผิดพลาดหายไป!
ดูเหมือนว่าจะยังคงเป็นบั๊กใน IntelliJ ล่าสุดและเกี่ยวข้องกับปัญหาการแคชที่เป็นไปได้หรือไม่?
หากคุณเพิ่มคำอธิบายประกอบ @Repository เป็น mk321 ที่กล่าวถึงข้างต้นให้บันทึกจากนั้นลบคำอธิบายประกอบและบันทึกอีกครั้งสิ่งนี้จะช่วยแก้ปัญหาได้
บางครั้ง - ในกรณีของฉันนั่นคือ - เหตุผลคือการนำเข้าที่ไม่ถูกต้อง ผมนำเข้าโดยบังเอิญ
import org.jvnet.hk2.annotations.Service
แทน
import org.springframework.stereotype.Service
โดยการยอมรับตัวเลือกแรกแบบสุ่มสี่สุ่มห้าในการนำเข้าที่แนะนำของ Idea ใช้เวลาสองสามนาทีในครั้งแรกที่เกิดขึ้น :-)
สิ่งที่คุณต้องทำเพื่อให้งานนี้มีรหัสต่อไปนี้:
@ComponentScan
public class PriceWatchTest{
@Autowired
private PriceWatchJpaRepository priceWatchJpaRepository;
...
...
}
ฉันต้องใช้ @EnableAutoConfiguration เพื่อจัดการกับมันอย่างไรก็ตามข้อผิดพลาดนี้ไม่มีผลกระทบต่อการทำงาน
สามารถแก้ไขได้โดยการวาง @EnableAutoConfiguration ในคลาสหลักของแอปพลิเคชันสปริงบูต
IntelliJ IDEA Ultimate
เพิ่มคลาสหลักของคุณใน IntelliJ Spring Application Context ตัวอย่างเช่น Application.java
File
-> Project Structure..
ด้านซ้าย: การตั้งค่าโครงการ -> โมดูล
ด้านขวา: ค้นหาในโครงสร้างแพ็คเกจของคุณ
Spring
และเพิ่ม+
Application.java
คุณได้ตรวจสอบว่าคุณได้ใช้@services
คำอธิบายประกอบกับการใช้บริการของคุณหรือไม่? มันได้ผลสำหรับฉัน
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserServices {}
ง่ายๆคุณต้องทำ 2 ขั้นตอน
@Autowired
เป็น@Resource
.==>> change @Autowired to @Resource
น่าแปลกที่โปรเจ็กต์ที่มุ่งเน้น Feign ซึ่งรันด้วย Eclipse ไม่สามารถรันใน InteliJ ได้ เมื่อเริ่มแอปพลิเคชัน InteliJ บ่นเกี่ยวกับไคลเอนต์ Feign ที่ฉันพยายามฉีดไปที่เลเยอร์ serviceImpl โดยกล่าวว่า: field personRestClient (ไคลเอนต์ Feign ของฉัน) ใน ... ต้องใช้ bean ชนิด ... ที่ไม่พบ พิจารณากำหนดชนิดของ bean ".... " ในการกำหนดค่าของคุณ
ฉันเสียเวลานานมากในการพยายามทำความเข้าใจว่าอะไรคือสิ่งที่ผิด ฉันพบวิธีแก้ปัญหา (สำหรับ InteliJ) ซึ่งฉันไม่เข้าใจอย่างสมบูรณ์:
หรือเลือก Eclipse :)
ตรวจสอบว่าบรรจุภัณฑ์ของถั่วของคุณเขียนถูกต้องหรือไม่
//Check if this is written right
package com.package1.package2.package3
import ...
@Service
class ServiceX {
...
}