2014-11-05 236 views
2

这里我有我的主类@ServiceRegionsServiceImpl。我使用ApplicationContext.getBean初始化它,但我想使用@Autowired。当我这样做时,@Autowired不会初始化它。将getBean替换为@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> { 
} 

而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) 
+0

(1)您是否收到一些错误?发布完整的错误堆栈跟踪。 (2)包含'@ Transactional'在'@ Service'类 – 2014-11-05 00:19:21

+0

越来越显示java.lang.NullPointerException因为regionsServiceImpl是包括@Transanctional 主类 null另IDE说,它不能自动装配,因为没有这样的豆类型被发现 – RebelUA 2014-11-05 00:24:50

+0

在你的文章中发布完整的错误堆栈跟踪。我需要看完整的细节。 – 2014-11-05 00:26:54

回答

0

您没有使用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()); 
    } 
} 
+0

我已经添加了这个,但regionsServiceImpl不被识别为bean,我猜有组件扫描或注释存在问题 – RebelUA 2014-11-05 08:41:36

+0

您可以添加完整的堆栈跟踪,我相信可能会导致创建regionServcieImpl时导致一些问题? – 2014-11-05 10:09:16