我的春季应用程序没什么问题。这是我的代码:
(储存库)
import com.maciej.entities.Etwas;
import com.maciej.repository.EtwasRepository;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import java.util.List;
HERE IS THE PROBLEM ----- @Component works, while @Repository doesn't
public class EtwasHibernateRepository implements EtwasRepository {
@PersistenceContext
private EntityManager entityManager;
@Override
public List<Etwas> findAll() {
return null;
}
@Override
public Etwas create(Etwas etwas) {
entityManager.persist(etwas);
return etwas;
}
@Override
public Etwas read(int id) {
TypedQuery<Etwas> query = entityManager.createQuery("SELECT e FROM Etwas e WHERE e.id=:id", Etwas.class);
query.setParameter("id", id);
Etwas etwas = query.getSingleResult();
return etwas;
}
@Override
public Etwas update(Etwas etwas) {
return null;
}
@Override
public boolean delete(int id) {
return false;
}
}
这是我的简单服务类:
import com.maciej.entities.Etwas;
import com.maciej.repository.impl.EtwasHibernateRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class EtwasService {
@Autowired
private EtwasHibernateRepository etwasHibernateRepository;
public boolean save(Etwas etwas){
etwasHibernateRepository.create(etwas);
return true;
}
public Etwas read(int id){
return etwasHibernateRepository.read(id);
}
}
和简单的测试类:
import com.maciej.Config;
import com.maciej.entities.Etwas;
import com.maciej.services.EtwasService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class Test {
public static void main(String[] args){
AnnotationConfigApplicationContext acac = new AnnotationConfigApplicationContext(Config.class);
Etwas etwas = acac.getBean("etwas", Etwas.class);
etwas.setSth("STATATASTAT");
EtwasService etwasService = acac.getBean("etwasService", EtwasService.class);
for(int i=0; i<=20; i++){
etwasService.save(etwas);
}
System.out.println(etwasService.read(7).toString());
System.out.println(etwas.getSth());
}
}
问题是,当我使用EtwasHibernateRepository
注释@Component
时,一切正常。当我添加时,实际上是apoperly - @Repository
注释我得到一个堆栈跟踪:
你有什么建议吗我做错了什么?
PS 代码非常简单,卷入并且仅用于测试,因此不关心:)
线程中的异常&#34; main&#34; org.springframework.beans.factory.BeanCreationException:错误 用名称&#39; etwasService&#39;创建bean:注入自动装配 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 autowire字段:私有 com.maciej.repository.impl.EtwasHibernateRepository com.maciej.services.EtwasService.etwasHibernateRepository;嵌套 例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有 合格的bean类型 找到[com.maciej.repository.impl.EtwasHibernateRepository] 依赖:预计至少有1个bean有资格成为autowire 这种依赖的候选人。依赖注释: {@ org.springframework.beans.factory.annotation.Autowired(所需=真)} 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 在 org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:304) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 在 org.springframework.context.annotation.AnnotationConfigApplicationContext。(AnnotationConfigApplicationContext.java:84) 在com.maciej.test.Test.main(Test.java:12)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:606)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 引起:org.springframework.beans.factory.BeanCreationException: 无法自动装配字段:私有 com.maciej.repository.impl.EtwasHibernateRepository com.maciej.services.EtwasService.etwasHibernateRepository;嵌套 例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有 合格的bean类型 找到[com.maciej.repository.impl.EtwasHibernateRepository] 依赖:预计至少有1个bean有资格成为autowire 这种依赖的候选人。依赖注释: {@ org.springframework.beans.factory.annotation.Autowired(所需=真)} 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ... 17更多引起: org.springframework.beans.factory.NoSuchBeanDefinitionException:没有 合格的bean类型 找到[com.maciej.repository.impl.EtwasHibernateRepository] 依赖:预计至少有1个bean有资格成为autowire 这种依赖的候选人。依赖注释: {@ org.springframework.beans.factory.annotation.Autowired(所需=真)} 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) ......还有19个
更新:配置
import com.maciej.entities.Etwas;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManagerFactory;
import java.util.Properties;
@Configuration
@ComponentScan
@EnableTransactionManagement
public class Config {
@Bean
public Etwas etwas(){
return new Etwas();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(dataSource());
emf.setPackagesToScan(new String[]{"com.maciej.entities"});
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
emf.setJpaVendorAdapter(vendorAdapter);
emf.setJpaProperties(additionalProperties());
return emf;
}
@Bean
public BasicDataSource dataSource(){
BasicDataSource bds = new BasicDataSource();
bds.setUsername("root");
bds.setPassword("maciek");
bds.setUrl("jdbc:mysql://localhost:3306/test");
bds.setDriverClassName("com.mysql.jdbc.Driver");
return bds;
}
private Properties additionalProperties(){
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.format_sql", "true");
return properties;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf); //entityManagerFactory().getObject()
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
}
答案 0 :(得分:2)
问题在于你没有编程到接口。
@Service
@Transactional
public class EtwasService {
@Autowired
private EtwasHibernateRepository etwasHibernateRepository;
autowired依赖是完全实现的类,而它应该是EtwasRepository
。这将使其适用于@Component
和@Repository
。除此之外,它也是正确的方法。
@Service
@Transactional
public class EtwasService {
@Autowired
private EtwasRepository etwasHibernateRepository;
使用@Repository
注释的Bean将启用自动异常转换,并将其应用于AOP。默认情况下,Spring使用基于接口的JDK动态代理。它将创建一个实现EtwasRepository
接口的动态类并应用aop拦截器。这使得EtwasRepository
类型的bean不再是EtwasHibernateRepository
类型的bean。
注释bean @Component
时不会应用此转换。
关于您的配置的说明不需要显式声明PersistenceExceptionTranslationPostProcessor
。这已经得到了解决。