大家好,我在使用 spring-JPA 和测试 main 方法中的代码时遇到了一些麻烦,如果有人能告诉我我在这里遗漏了什么或者能指导我找到一个好的完整教程,我将不胜感激。
这是我的配置类
@Configuration
@EnableJpaRepositories
public class Config {
@Bean
public InsertExample insertExample() {
return new InsertExample() ;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean() ;
emfb.setDataSource(dataSource());
emfb.setPackagesToScan("com.solveit.insert");
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter() ;
emfb.setJpaVendorAdapter(vendorAdapter);
return emfb ;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/datastore");
dataSource.setUsername("root");
dataSource.setPassword("nikolis");
return dataSource ;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
JpaTransactionManager transactionManager = new JpaTransactionManager() ;
transactionManager.setEntityManagerFactory(emf);
return transactionManager ;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor() ;
}
@Bean
public Properties hibernateProperties() {
Properties hibernateProps = new Properties();
hibernateProps.setProperty("hibernate.hbm2ddl.auto", "create");
return hibernateProps;
}
}
这是我的仓库
public interface ExampleRepository extends CrudRepository<ExampleModel, Long> {
List<ExampleModel> findByLastName(String lastName);
}
这是模型
@Entity
public class ExampleModel {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@Column
private String klass ;
@ElementCollection
private List<Double> features ;
public ExampleModel() {
}
public ExampleModel(String klass, ArrayList<Double> features) {
this.klass=klass ;
this.features=features ;
}
public String getKlass() {
return klass;
}
public void setKlass(String klass) {
this.klass = klass;
}
public ArrayList<Double> getFeatures() {
return (ArrayList<Double>) features;
}
public void setFeatures(ArrayList<Double> features) {
this.features = features;
}
}
这是我的测试代码:
@Configuration
@Import({ Config.class })
public class InsertExample implements CommandLineRunner {
@Autowired
ExampleRepository repository ;
public static void main(String args[]) throws FileNotFoundException{
SpringApplication.run(InsertExample.class);
}
public void run(String... arg0) throws Exception {
PrintStream out = new PrintStream(new FileOutputStream("output.txt"));
ArrayList<Double> asdf = new ArrayList<Double>();
asdf.add(23.123) ;
asdf.add(23.123) ;
asdf.add(23.123) ;
asdf.add(23.123) ;
ExampleModel example = new ExampleModel("first", asdf) ;
repository.save(example) ;
}
}
这是我得到的异常
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'insertExample': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.solveit.insert.ExampleRepository com.solveit.insert.InsertExample.repository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.solveit.insert.ExampleRepository] 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:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.solveit.insert.InsertExample.main(InsertExample.java:33)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.solveit.insert.ExampleRepository com.solveit.insert.InsertExample.repository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.solveit.insert.ExampleRepository] 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$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 15 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.solveit.insert.ExampleRepository] 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.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 17 more
最佳答案
您需要将此注释与包路径一起使用:
@EnableJpaRepositories("com.solveit.insert.hereyourrepositories")
更新: 至少,您必须在更改@EnableJpaRepositories 中的路径后执行此操作:
1.Spring boot config需要这个结构。因为spring并没有像JPA一样开始扫描需要初始化的bean。
http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-structuring-your-code.html
2.只能使用JpaTransactionManager
PlatformTransactionManager 是接口(interface),而 JPATransactionManager 是理解 JPA 的接口(interface)的实现。
您应该阅读 Spring 引用中的事务管理一章以更好地理解该主题。
http://docs.spring.io/spring/docs/3.0.4.RELEASE/spring-framework-reference/html/transaction.html
- hibernateProps.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");
它需要与 JPA 一起工作。
其他变化不重要。
关于java - Spring Hibernate-JPA 使用基于 Java 的配置 org.springframework.beans.factory.NoSuchBeanDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32665614/