2014-11-05 225 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