さて、同じトピックについて多くの質問があることを知っています。しかし、私は何もうまくいかないようです。また、自動配線の概念をまだ完全に理解していない場合もあります。私の問題:必要なページに到達できますが、アクションを実行するためにanyボタンをクリックするたびに、Nullポインター例外が発生します。
したがって、@ 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)
応答に基づいて解決回答: JayとLuayの回答に基づいていくつかの変更を加えました。そして、私のApplicationConfigファイルの注釈を次のように変更しました。
@Configuration
@ComponentScan("my.basepackage.*")
@EnableJpaRepositories(basePackages = {"my.basepackage.*"})
@EntityScan("my.basepackage.*")
@EnableAutoConfiguration
これが何らかの助けになることを願っています。
しかし、*が正しい方法かどうかはわかりません。
注釈側にいくつかの変更を加えて、アプリケーションを実行できます。
問題になっているのと同じクラスを使用しました。以下の構造と使用されている構成を参照してください。 ディレクトリ構造
以下のようにパッケージを使用し、クラスを追加しました。
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);
}
}
完全なコードの場合: コードはここをクリック
アプリケーションがUserRepository
クラスをスキャンできないと思います。SpringBootを使用している場合は、パッケージ階層の最上位にメインクラスを配置する必要があります。
また、_@EnableJpaRepositories
_を使用し、リポジトリの基本パッケージを指定して、リポジトリ機能を有効にする必要があります
@EnableJpaRepositories(basePackages ={"com.springBoot.usl.repo"})
Configクラスで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;
}
UserRepository
は、単に現在のSpringコンテキストでは定義されていません。 Springによってスキャンされるパッケージでクラスが定義されていることを確認してください。 Springでパッケージをスキャンするには、Configurationクラスで@ComponentScan("org.my.pkg")
を使用する必要があります。
Spring Bootを使用している場合は、@SpringBootApplication
が含まれているため、他のクラスの上にあるルートパッケージで@ComponentScan
アノテーションが付けられたメインアプリケーションクラスを見つけてください。