IT

스프링 부트 @autowired가 작동하지 않습니다.클래스는 다른 패키지로 되어 있습니다.

itgroup 2023. 3. 29. 21:24
반응형

스프링 부트 @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

반응형