스프링 부트 @autowired가 작동하지 않습니다.클래스는 다른 패키지로 되어 있습니다.
Spring Boot 어플리케이션이 있다.
다음과 같은 오류가 발생합니다.
org. springframework.콩류.빈크리에이션예외:이름이 'birthdayController'인 콩을 생성하는 동안 오류가 발생했습니다.자동 배선 종속성을 주입하지 못했습니다. 중첩된 예외는 org.springframework입니다.콩류.빈크리에이션예외:private com.esri.birthdays.dao 필드를 자동 연결할 수 없습니다.BirthdayRepository com.esri.birthdays.controller.BirthdayController.repository. nested 예외는 org.springframework입니다.콩류.Such Bean Definition 없음예외:[ com . esri . birthdays . dao ]타입의 콩이 없습니다.종속성에 대한 BirthdayRepository]를 찾았습니다. 이 종속성에 대한 자동 배선 후보로 적합한 빈이 하나 이상 필요합니다.종속성 주석: {@org.springframework}.콩.공장.배송.org.springframework에서 자동 배선(필수=true)되었습니다.콩.공장.배송.Autowired Annotation Bean Post Processor 。postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)~[ spring - beans - 4.2 . 4 ]org.springframework에서 RELEASE.jar:4.2.4.RELEASE]를 참조해 주세요.콩류.지지하다.추상적인AutoowireAbleBeanFactory.populateBean(개요)AutoowireAbleBeanFactory.java:1214)~[ spring - beans - 4.2 . 4 ]org.springframework에서 RELEASE.jar:4.2.4.RELEASE]를 참조해 주세요.콩류.지지하다.추상적인AutoowireAbleBeanFactory.doCreateBean(개요)AutoowireAbleBeanFactory.java:543)~[ spring - beans - 4.2 . 4 ]org.springframework에서 RELEASE.jar:4.2.4.RELEASE]를 참조해 주세요.콩류.지지하다.추상적인AutoowireAbleBeanFactory.createBean(개요)AutoowireAbleBeanFactory.java:482)~[ spring - beans - 4.2 . 4 ]org.springframework에서 RELEASE.jar:4.2.4.RELEASE]를 참조해 주세요.콩류.지지하다.Abstract Bean Factory $1.get Object(Abstract Bean Factory.java:306)~[ spring - beans - 4.2 . 4 ]RELEASE.jar: 4.2.4.RELEASE] 또는
다음은 내 저장소 클래스의 코드입니다.
package com.esri.birthdays.dao;
import com.esri.birthdays.model.BirthDay;
public interface BirthdayRepository extends MongoRepository<BirthDay,String> {
public BirthDay findByFirstName(String firstName);
}
다음은 컨트롤러입니다.
package com.esri.birthdays.controller;
@RestController
public class BirthdayController {
@Autowired
private BirthdayRepository repository;
같은 패키지에 포함되어 있는 경우에 동작합니다.왜 그런지 모르겠다
에서 @SpringBootApplication 주석을 사용하는 경우(예: 패키지)
com.company.config
다음과 같이 컴포넌트를 자동으로 스캔합니다.
@ComponentScan("com.company.config")
따라서 com.company.controller 등의 패키지는 스캔되지 않습니다.따라서 com.company 또는 scanBasePackages 속성을 사용하여 다음과 같이 일반 패키지보다 한 단계 먼저 @SpringBootApplication을 패키지로 선언해야 합니다.
@SpringBootApplication(scanBasePackages = { "com.company" })
OR 컴포넌트 스캔:
@SpringBootApplication
@ComponentScan("com.company")
패키지를 @SpringBootApplication 태그 안에 넣기만 하면 됩니다.
@SpringBootApplication(scanBasePackages = { "com.pkg1", "com.pkg2", .....})
알려줘.
를 .@ComponentScan("com.esri.birthdays")
으로 말하면루트로 .프로젝트에 하위 패키지가 있는 경우 프로젝트 루트에서 관련 클래스를 검색해야 합니다.「com.esri.」는, 「com.esri.」를 참조해 주세요.ComponentScan의 컴포넌트스캔의 컴포넌트스캔의 컴포넌트스캔의 컴포넌트.
이것을 시험해 보세요.
@Repository
@Qualifier("birthdayRepository")
public interface BirthdayRepository extends MongoRepository<BirthDay,String> {
public BirthDay findByFirstName(String firstName);
}
그리고 콩을 주입할 때:
@Autowired
@Qualifier("birthdayRepository")
private BirthdayRepository repository;
그렇지 않은 경우 Configuration에서 CoomponentScan을 확인합니다.
Spring Boot Application 클래스의 동일한 패키지(또는 서브 패키지)에 포함되어 있는 한 Spring Boot은 이러한 저장소를 자동으로 처리합니다.등록 프로세스를 보다 상세하게 제어하려면 @EnableMongoRepositorys 주석을 사용하십시오.spring.io 가이드
@SpringBootApplication
@EnableMongoRepositories(basePackages = {"RepositoryPackage"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
같은 에는 ★★★★★★★★★★★★★★★★★★★★★★★.@component
.new <classname>()
.
코드의 임의의 장소에서 기존의 Java로 인스턴스를 초기화할 경우 스프링은 IOC 컨테이너에 해당 컴포넌트를 추가하지 않습니다.
이런 문제 때문에 결국 퍼팅을 하게 되었습니다.@Service
새로 생성된 서비스 클래스에 주석을 추가한 후 자동 배선이 선택되었습니다. 자동 배선이를 들어, 필요한 주석)이 합니다.@Controller
,@Service
등하여 다시
기본적으로는 Spring 부팅 응용 프로그램에서 컴포넌트 스캔은 기본 클래스가 있는 컴포넌트 검색이 수행됩니다.패키지 외부에 있는 모든 콩은 생성되지 않으므로 위의 예외를 인정합니다.
해결 방법: 콩을 메인 스프링 부트 클래스로 이동하거나(좋은 방법이 아닙니다), 별도의 구성 파일을 생성하여 Import할 수 있습니다.
@Import({CustomConfigutation1.class, CustomConfiguration2.class})
@SpringBootpplication
public class BirthdayApplication {
public static void main(String [] args) {
springApplication.run(BirthdayApplication.class, args );
}
}
이러한 Custom Configuration 파일에 콩을 추가합니다.
저도 같은 문제가 있었어요.Autowired 개체에서 개인 수식자를 제거했을 때 작동했습니다.
이 문제를 해결할 수 있는 또 다른 재미있는 방법은 세터 메서드의 파라미터에 주석을 다는 것입니다.(생성자와는 달리) setter 메서드의 경우 메서드 전체에 주석을 달아야 합니다.
이 조작은, 나에게는 적합하지 않습니다.public void setRepository(@Autowired WidgetRepository repo)
단, 이것은 다음과 같습니다.@Autowired public void setRepository(WidgetRepository repo)
(스프링 부트 2.3.2)
생일과 관련된 필드가 들어 있는 빈도 분명히 있을 것입니다. 그러니 이것을 사용하면 당신의 문제가 해결될 것입니다.
@SpringBootApplication
@EntityScan("com.java.model*") // base package where bean is present
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
package com.test.springboot;
@SpringBootApplication
@ComponentScan(basePackages = "com.test.springboot")
public class SpringBoot1Application {
public static void main(String[] args) {
ApplicationContext context= SpringApplication.run(SpringBoot1Application.class, args);
=====================================================================
package com.test.springboot;
@Controller
public class StudentController {
@Autowired
private StudentDao studentDao;
@RequestMapping("/")
public String homePage() {
return "home";
}
추가할 때@ComponentScan("com.firstday.spring.boot.services")
또는scanBasePackages{"com.firstday.spring.boot.services"}
jsp가 로드되지 않았습니다.그래서 @SpringBootApplication 클래스에 프로젝트의 부모 패키지를 추가하면 제 경우 정상적으로 동작합니다.
코드 예:-
package com.firstday.spring.boot.firstday;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = {"com.firstday.spring.boot"})
public class FirstDayApplication {
public static void main(String[] args) {
SpringApplication.run(FirstDayApplication.class, args);
}
}
언급URL : https://stackoverflow.com/questions/34367316/spring-boot-autowired-does-not-work-classes-in-different-package
'IT' 카테고리의 다른 글
PHP에서 json을 xml로 변환하는 방법이 있습니까? (0) | 2023.03.29 |
---|---|
Gson용 커스텀 JSON 디시리얼라이저를 작성하려면 어떻게 해야 하나요? (0) | 2023.03.29 |
Greasemonkey 스크립트에서 XMLHttpRequests를 대행 수신하려면 어떻게 해야 합니까? (0) | 2023.03.29 |
oneOf 개체에 대한 Json 스키마 예제 (0) | 2023.03.29 |
React.js의 선언과 명령의 차이는 무엇입니까? (0) | 2023.03.29 |