2017-05-24 85 views
2

これは同じトピックについて多くの質問があります。しかし、何も働かないようです。私はまだオートワイヤリングの概念を完全に理解していない場合もあります。 私の問題: 私は必要なページにアクセスすることができますが、アクションを実行するために任意のボタンをクリックするたびに、春が正しく必要なBeanをマップできるとは思わないため、Nullポインタ例外が発生します。Autowiring:この依存関係のautowire候補となる少なくとも1つのbeanが必要です

したがって、@ autowired = trueを追加すると、上記の例外が発生します。 私は何をする必要があるのか​​分かりません。誰かがこれで私を助けてくれることを願っています。同様の説明を大好きだ:) コード:

@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) 

回答: 私はジェイとLuayの回答に基づいていくつかの変更を行いました。これは、いくつかのいずれかを助け

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

希望:次のように、私のApplicationConfigファイルに注釈を変更しました。

しかし、*正しい方向へ行くかどうかはわかりません。あなたは@Repository interfaceを注釈を付けてはいけません

@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; 
    } 

答えて

0

@Repository public interface UserRepository ..

あなたはUserRepository

例の実装に注釈を付けることがあります。

@Repository 
public class UserRepositoryImpl implements UserRepository {} 
+0

ありがとうございます。しかし、これを追加すると、 名前 'userDetailController'のBeanを作成する際にエラーが発生します。autowired依存関係の注入に失敗しました。ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionExceptionです: 'entityManagerFactory'という名前のBeanは定義されていません –

-1

:あなたはApplicationConfigの

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

} 

例以下のようにリポジトリを含むパッケージを指定して、あなたのconfigクラスでJPAリポジトリを有効にする必要があり

1

私はあなたが春のブートを使用している場合は、メインを置く必要があり、アプリケーションがUserRepositoryクラスをスキャンすることはできないと思いますクラスをパッケージ階層の最上位に配置します。

また@EnableJpaRepositoriesを使用して、リポジトリの機能

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

+0

ありがとうございます。しかし、これを追加すると、名前が 'userDetailController'のBeanを作成中にエラーが発生します。autowired依存関係の注入に失敗しました。ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionExcept ionです: 'entityManagerFactory'という名前のBeanは定義されていません –

+0

Jayの答えに従っているなら、この例ではbeanの 'entityManagerFactory'を作成するので、このエラーは発生しません。 、Spring Data JPAをSpringブートで使用している場合、entityManagerFactoryのBeanを作成する必要はありませんSpringは1つを提供します –

0

UserRepositoryを有効にするには、あなたのリポジトリのベースパッケージが単に現在の春のコンテキストで定義されていないことを教えてください。 クラスがSpringでスキャンされたパッケージに定義されていることを確認してください。 Springがパッケージをスキャンするようにするには、Configurationクラスで@ComponentScan("org.my.pkg")を使用する必要があります。

Springブートを使用している場合、他のクラスの上のルートパッケージに@SpringBootApplicationという注釈が付けられているメインアプリケーションクラスが、@ComponentScanであることを確認してください。

2

アノテーション側でいくつかの変更を加えてアプリケーションを実行できます。

私は問題のクラスと同じクラスを使用しています。使用されている構造と構成を下記をご覧ください。私は以下のようにパッケージを使用して、あなたのクラスを追加し、完全なコードについては
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); 
    } 
} 

いる Directory Structure

click here for code

+0

応答ありがとう:) –

+0

Great.Please正しい解決方法を試してください。 –

+0

私はdao、service、controller(springboot)に3つの異なるレイヤーを使用していましたが、サービスビーンを見つけられませんでした。ありがとう – Malav

関連する問題

 関連する問題