복붙노트

[SPRING] Autowiring :이 종속성에 대한 autowire 후보가 될 것으로 예상되는 적어도 하나의 bean

SPRING

Autowiring :이 종속성에 대한 autowire 후보가 될 것으로 예상되는 적어도 하나의 bean

좋아, 나는 같은 주제에 대해 많은 질문이 있다는 것을 알고있다. 하지만 아무것도 작동하지 않는 것 같습니다. 내가 아직 자동 배선 개념을 완전히 이해하지 못했을 수도 있습니다. 내 문제: 필요한 페이지로 갈 수 있지만, 아무 버튼이나 클릭 할 때마다 스프링이 콩을 올바르게 매핑 할 수 있다고 생각되는 것처럼 보이지 않는 널 포인터 예외가 발생합니다.

그래서, @ autowired = true를 추가하면, 그것은 위의 주어진 exceptionn을 제공합니다. 나는 무엇이해야 할 지 모르겠다. 누군가가 나를 도와 줄 수 있기를 희망한다. 설명도 좋아할 것입니다 :) 암호:

@Entity
@Table(name="userDetails")
public class UserDetailModel {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int user_id;
public String password;
public String user_name;
public String active_status;

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getUser_name() {
    return user_name;
}

public void setUser_name(String user_name) {
    this.user_name = user_name;
}

public int getUser_id() {
    return user_id;
}

public void setUser_id(int user_id) {
    this.user_id = user_id;
}

public String getActive_status() {
    return active_status;
}

public void setActive_status(String active_status) {
    this.active_status = active_status;
}

}

제어 장치:

@RestController
public class UserDetailController {

 private Logger logger = (Logger) LoggerFactory.getLogger(UserDetailController.class);
 @Autowired(required = true)
private UserRepository userRepository;

@RequestMapping(value="/login", method = RequestMethod.POST)
public @ResponseBody String addNewUser (@RequestBody UserDetailModel user) {
    // @ResponseBody means the returned String is the response, not a view name
    // @RequestParam means it is a parameter from the GET or POST request

    logger.debug("in controller");
    UserDetailModel userDtl = new UserDetailModel();
    userDtl.setUser_id(user.user_id);
    userDtl.setUser_name(user.user_name);
    userDtl.setActive_status(user.active_status);
    userDtl.setPassword(user.password);

    userRepository.save(userDtl);
    return "Saved";
}

}

저장소:

@Repository
public interface UserRepository extends CrudRepository<UserDetailModel,         Long> {}

스택 추적 :

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDetailController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.springBoot.usl.repo.UserRepository com.springBoot.usl.controller.UserDetailController.userRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.springBoot.usl.repo.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:683)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:944)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:933)
at com.springBoot.usl.controller.WebAppInitializer.main(WebAppInitializer.java:18)

응답에 따라 해결됨 대답: 나는 제이와 루이의 대답을 바탕으로 몇 가지 수정을했다. 그리고 내 ApplicationConfig 파일에서 다음과 같이 주석을 변경했습니다.

@Configuration
@ComponentScan("my.basepackage.*")
@EnableJpaRepositories(basePackages = {"my.basepackage.*"})
@EntityScan("my.basepackage.*")
@EnableAutoConfiguration

희망이 어떤 도움이됩니다.

그러나 *가 올바른 방향인지 확실하지 않습니다.

해결법

  1. ==============================

    1.어노테이션 측면에서 몇 가지 변경 사항을 적용하여 애플리케이션을 실행할 수 있습니다.

    어노테이션 측면에서 몇 가지 변경 사항을 적용하여 애플리케이션을 실행할 수 있습니다.

    문제가되는 동일한 수업을 사용했습니다. 사용 된 구조 및 구성은 아래를 참조하십시오. 디렉토리 구조

    나는 아래와 같이 꾸러미를 사용했고 수업을 추가했다. com.rcmutha.usl.controller com.rcmutha.usl.repository

    @SpringBootApplication
    @ComponentScan({"com.rcmutha*"})
    @EntityScan("com.rcmutha*")
    @EnableJpaRepositories("com.rcmutha*")
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    전체 코드 : 코드를 보려면 여기를 클릭하십시오.

  2. ==============================

    2.귀하의 응용 프로그램이 UserRepository 클래스를 검사 할 수 없다고 생각합니다. Spring Boot를 사용하고 있다면 패키지 계층의 최상위에 기본 클래스를 놓아야합니다.

    귀하의 응용 프로그램이 UserRepository 클래스를 검사 할 수 없다고 생각합니다. Spring Boot를 사용하고 있다면 패키지 계층의 최상위에 기본 클래스를 놓아야합니다.

    또한 @EnableJpaRepositories를 사용하여 리포지토리의 기본 패키지에 리포지토리 기능을 사용하도록 설정해야합니다.

    @EnableJpaRepositories (basePackages = { "com.springBoot.usl.repo"})

  3. ==============================

    3.설정 클래스에서 JPA 저장소를 활성화하고 저장소가 포함 된 패키지를 아래와 같이 지정해야합니다

    설정 클래스에서 JPA 저장소를 활성화하고 저장소가 포함 된 패키지를 아래와 같이 지정해야합니다

    @Configuration
    @EnableJpaRepositories(basePackages = {
        "com.springBoot.usl.repo"
    })
    public class ApplicationConfig {
    
    }
    

    ApplicationConfig의 예 :

    @Configuration
    @EnableJpaRepositories(basePackages = {"com.springBoot.usl.repo"})
    @EnableTransactionManagement
    public class ApplicationConfig {
    
        @Bean
        public DataSource dataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://localhost:3306/xxxx");
            dataSource.setUsername("xxxx");
            dataSource.setPassword("xxxx");
    
            return dataSource;
        }
    
        @Bean
        public EntityManagerFactory entityManagerFactory() {
            HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            vendorAdapter.setGenerateDdl(true);
            LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
            factory.setJpaVendorAdapter(vendorAdapter);
            factory.setPackagesToScan("xx.xxxx.xxxx.xxxx.domain");
            factory.setDataSource(dataSource());
            factory.afterPropertiesSet();
            return factory.getObject();
        }
    
        @Bean
        public PlatformTransactionManager transactionManager() {
            JpaTransactionManager txManager = new JpaTransactionManager();
            txManager.setEntityManagerFactory(entityManagerFactory());
            return txManager;
        }
    
  4. ==============================

    4.UserRepository는 현재 Spring 문맥에서 단순히 정의되지 않는다. 클래스가 Spring에서 스캔 한 패키지에 정의되어 있는지 확인하십시오. Spring이 패키지를 스캔하게하려면 Configuration 클래스에서 @ComponentScan ( "org.my.pkg")을 사용해야 할 것이다.

    UserRepository는 현재 Spring 문맥에서 단순히 정의되지 않는다. 클래스가 Spring에서 스캔 한 패키지에 정의되어 있는지 확인하십시오. Spring이 패키지를 스캔하게하려면 Configuration 클래스에서 @ComponentScan ( "org.my.pkg")을 사용해야 할 것이다.

    Spring Boot를 사용하고 있다면, @ComponentScan을 포함하고있는 다른 클래스 위의 루트 패키지에서 @SpringBootApplication으로 주석이 달린 메인 애플리케이션 클래스를 찾아야한다.

  5. from https://stackoverflow.com/questions/44149690/autowiring-expected-at-least-1-bean-which-qualifies-as-autowire-candidate-for-t by cc-by-sa and MIT license