当前位置: 首页 > 知识库问答 >
问题:

Spring注释:@Component工作,@Repository不工作

谢俊悟
2023-03-14

我的spring应用程序有点小问题。下面是我的代码:

(存储库)

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());
    }
}

更新:配置

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();
    }

}

共有1个答案

林元明
2023-03-14

问题在于你没有对接口编程。

@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拦截器。这使得bean的类型为ETWASRepository,而不再是ETWASHibernateRepository

在注释bean@component时不应用此转换。

关于配置的说明不需要PersistenceExceptionTranslationPostProcessor的显式声明。已经处理好了。

 类似资料:
  • 我在玩和 这是我的应用程序上下文文件 以下是我的Java类 HelloWorld1。JAVA 住址JAVA 这里是我尝试运行东西的地方-应用程序。JAVA 我一直在得到这个异常-理想情况下我不应该,因为我已经定义了id为'address1'的@Qualifier注释-所以它不应该抛出异常 警告:上下文初始化过程中遇到的异常-取消刷新尝试:org.springframework.beans.fact

  • 我将Spring 3.2.4与JavaFX结合使用,并希望实现一种方法,其中操作将在事务中执行。我在控制器中的代码如下所示: 以及我的应用程序上下文: 尝试运行时,我收到以下错误消息: 该方法存在。删除注释,或者将方法从public更改为private,或者从配置中删除bean,程序就会运行,但事务注释根本不起作用。删除代理目标会导致另一个错误。

  • 我有一个简单的类叫BeaconDao 然而,当我用@service或@component标记beaconDao时,一切都运行得非常好。有人能看出问题所在吗?

  • 我想允许一个域的跨源请求。我的项目使用Spring,所以我想利用新的CORS支持。 我遵循下面的示例https://spring.io/blog/2015/06/08/cors-support-in-spring-framework#disqus_thread并尝试了第一个版本。我的控制器注释如下所示: 如果我理解正确的话,mvc-config是一种替代方法。我也试过了: 对于这两种方法,响应似乎

  • 因此,我试图在IntelliJ中使用项目配置设置中的spring选项启动一个新的web项目,但当我最终获得项目设置时,似乎我创建的任何新控制器都被忽略了,即使我对它们进行了注释。@RequestMapping似乎从未被映射。我所能访问的只是位于web目录根目录中的文件。 在无法使其工作之后,我切换到Gradle,以便可以导入一些额外的库来测试我的项目。我的gradle文件如下所示: 是否有某种配置

  • 我是Spring Boot的新手,我有一个Spring Boot应用程序似乎忽略了@PreDestroy注释-当我从命令行或通过Eclipse运行时,我从来没有看到@PreDestroy代码在应用程序关闭时运行(例如通过ctrl-c) 代码如下。。。 应用java: 消息处理器配置: 消息处理器: