【问题标题】:Replace getBean with @Autowired for Service将 getBean 替换为 @Autowired for Service
【发布时间】:2015-01-01 01:42:00
【问题描述】:

在这里,我的主要课程是@Service,名为RegionsServiceImpl。我正在使用 ApplicationContext.getBean 对其进行初始化,但我想使用 @Autowired。当我这样做时,@Autowired 不会初始化它。

主类:

package com.rebel.shop;

public class JpaRepoTest {

    //ApplicationContext ctx;

    @Autowired
    RegionsServiceImpl regionsServiceImpl;

    public JpaRepoTest() {
    //    ctx = new AnnotationConfigApplicationContext(DataConfig.class);
    //    regionsServiceImpl = ctx.getBean("regionsServiceImpl", RegionsServiceImpl.class);
    }

    public static void main(String[] args) {
        JpaRepoTest jpaRepoTest = new JpaRepoTest();
        jpaRepoTest.testService();
    }

    private void testService() {
         System.out.println(regionsServiceImpl.findById(3l).getName());
    }
}

我的服务类:

package com.rebel.shop.persistence.jpa.service;

@Service
public class RegionsServiceImpl implements RegionsService {

    @Resource
    private RegionsRepository regionsRepository;

    @Override
    public Regions findById(long id) {
        return regionsRepository.findOne(id);
    }
}

它的界面:

package com.rebel.shop.persistence.jpa.service;

public interface RegionsService {
    public Regions findById(long id);
}

回购:

package com.rebel.shop.persistence.jpa.repository;

public interface RegionsRepository extends JpaRepository<Regions, Long> {
}

以及 Spring 的 Java 配置:

package com.rebel.shop.persistence.jpa.config;

@Configuration
@EnableTransactionManagement
@PropertySource("classpath:app.properties")
@EnableJpaRepositories("com.rebel.shop.persistence.jpa.repository")
@ComponentScan("com.rebel.shop")

public class DataConfig {

    private static final String PROP_DATABASE_DRIVER = "db.driver";
    private static final String PROP_DATABASE_PASSWORD = "db.password";
    private static final String PROP_DATABASE_URL = "db.url";
    private static final String PROP_DATABASE_USERNAME = "db.username";
    private static final String PROP_HIBERNATE_DIALECT = "db.hibernate.dialect";
    private static final String PROP_HIBERNATE_SHOW_SQL = "db.hibernate.show_sql";
    private static final String PROP_ENTITYMANAGER_PACKAGES_TO_SCAN = "db.entitymanager.packages.to.scan";
    private static final String PROP_HIBERNATE_HBM2DDL_AUTO = "db.hibernate.hbm2ddl.auto";

    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(env.getRequiredProperty(PROP_DATABASE_DRIVER));
        dataSource.setUrl(env.getRequiredProperty(PROP_DATABASE_URL));
        dataSource.setUsername(env.getRequiredProperty(PROP_DATABASE_USERNAME));
        dataSource.setPassword(env.getRequiredProperty(PROP_DATABASE_PASSWORD));

        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {

        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }

    @Bean
    public HibernateExceptionTranslator hibernateExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setShowSql(false);
        vendorAdapter.setGenerateDdl(false);
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.rebel.shop.persistence.entity");
        factory.setDataSource(dataSource());
        factory.afterPropertiesSet();

        return factory.getObject();
    }

  // @Bean
  // RegionsServiceImpl regionsServiceImpl() {
  //      return new RegionsServiceImpl();
  //  }
}

提前致谢!

UPD1:

例外:

Exception in thread "main" java.lang.NullPointerException
    at com.rebel.shop.JpaRepoTest.testService(JpaRepoTest.java:33)
    at com.rebel.shop.JpaRepoTest.main(JpaRepoTest.java:29)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

【问题讨论】:

  • (1)您是否收到错误消息?发布完整的错误堆栈跟踪。 (2) 在@Service 类中包含@Transactional
  • getting java.lang.NullPointerException 因为 regionServiceImpl 在主类中为 null Included @Transanctional IDE 还说它不能自动装配,因为没有找到这种类型的 bean
  • 在您的帖子中发布完整的错误堆栈跟踪。我需要查看完整的详细信息。
  • 在你的代码中包含你的类和接口的包声明,似乎有些没有被扫描。
  • 我已经包含了包和错误堆栈跟踪

标签: java spring jpa spring-data spring-data-jpa


【解决方案1】:

您没有使用 spring 容器,而是使用 new 实例化对象,因此不会自动装配 spring bean,修改您的 bean 如下

package com.rebel.shop;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(DataConfig.class)
public class JpaRepoTest {

    //ApplicationContext ctx;

    @Autowired
    RegionsServiceImpl regionsServiceImpl;

    public JpaRepoTest() {
    //    ctx = new AnnotationConfigApplicationContext(DataConfig.class);
    //    regionsServiceImpl = ctx.getBean("regionsServiceImpl", RegionsServiceImpl.class);
    }

    @Test
    public void mainMethod() {
        testService();
    }

    private void testService() {
         System.out.println(regionsServiceImpl.findById(3l).getName());
    }
}

【讨论】:

  • 我已经添加了这个但是regionsServiceImpl没有被识别为bean,我猜是组件扫描或者注释有问题
  • 你能添加完整的堆栈跟踪吗,我相信创建 regionServcieImpl 可能会导致一些问题?
猜你喜欢
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2015-06-30
相关资源
最近更新 更多