Spring данные JPA Repository @autowired дает null

Вопрос:Я пробовал spring-data-jpa. С помощью Reference Documentation и моих предыдущих spring знаний я настроил конфигурацию spring -data-jpa, но Repository, что я @Autowired всегда возвращается null. Я имею в виду другие вопросы, но я не нашел решения. Конфигурация My ApplicationContext - @Configuration @EnableJpaRepositories("devopsdistilled.operp.server.data") @EnableTransactionManagement @PropertySource("server/jdbc.properties") @ComponentScan("devopsdistilled.operp.server.data") public class JpaContext { @Inject private Environment env; @Value("devopsdistilled.operp.server.data.entity") private

Вопрос:

Я пробовал spring-data-jpa. С помощью Reference Documentation и моих предыдущих spring знаний я настроил конфигурацию spring -data-jpa, но Repository, что я @Autowired всегда возвращается null. Я имею в виду другие вопросы, но я не нашел решения.

Конфигурация My ApplicationContext

@Configuration @EnableJpaRepositories(«devopsdistilled.operp.server.data») @EnableTransactionManagement @PropertySource(«server/jdbc.properties») @ComponentScan(«devopsdistilled.operp.server.data») public class JpaContext { @Inject private Environment env; @Value(«devopsdistilled.operp.server.data.entity») private String packagesToScan; @Bean public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } @Bean public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(env.getProperty(«jdbc.driverClassName»)); dataSource.setUrl(env.getProperty(«jdbc.url»)); dataSource.setUsername(env.getProperty(«jdbc.username»)); dataSource.setPassword(env.getProperty(«jdbc.password»)); dataSource.setInitialSize(2); dataSource.setMaxActive(10); return dataSource; } @Bean public JpaVendorAdapter jpaVendorAdapter() { HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); jpaVendorAdapter.setDatabase(Database.MYSQL); jpaVendorAdapter.setGenerateDdl(true); jpaVendorAdapter.setShowSql(true); jpaVendorAdapter .setDatabasePlatform(«org.hibernate.dialect.MySQL5Dialect»); return jpaVendorAdapter; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); emf.setDataSource(this.dataSource()); emf.setJpaVendorAdapter(this.jpaVendorAdapter()); emf.setPackagesToScan(packagesToScan); emf.setJpaProperties(this.hibernateProperties()); return emf; } @Bean public JpaDialect jpaDialect() { return new HibernateJpaDialect(); } @Bean public JpaTransactionManager transactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory() .getObject()); transactionManager.setJpaDialect(jpaDialect()); return transactionManager; } @Bean public Properties hibernateProperties() { Properties hibernateProps = new Properties(); hibernateProps.setProperty(«hibernate.hbm2ddl.auto», «create»); return hibernateProps; } @Bean public PersistenceExceptionTranslationPostProcessor exceptionTranslationPostProcessor() { return new PersistenceExceptionTranslationPostProcessor(); } }

Определение Entity My выглядит следующим образом

@Entity public class Item implements Serializable { private static final long serialVersionUID = 7751126479626962944L; private Long id; private String name; @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return new String(«Id: » + getId() + «nName: » + getName()); }

}

код >

Мое Репозиторий выглядит следующим образом

@Repository public interface ItemRepository extends JpaRepository { }

Пока я пытаюсь запустить пример приложения следующим образом

public class ServerApp {

@Inject ItemRepository itemRepository; public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext( JpaContext.class); new ServerApp().sampleMethod(); System.out.println(context); } public void sampleMethod() { Item item = new Item(); item.setName(«Test Item»); item = itemRepository.save(item); System.out.println(itemRepository.findOne(item.getId())); System.out.println(«From sampleMethod»); }

}

код >

Я получаю следующий вывод в консоли.

SLF4J: Failed to load class «org.slf4j.impl.StaticLoggerBinder». SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Apr 29, 2013 5:31:24 PM org.hibernate.annotations.common.Version INFO: HCANN000001: Hibernate Commons Annotations {4.0.1.Final} Apr 29, 2013 5:31:24 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core {4.1.9.Final} Apr 29, 2013 5:31:24 PM org.hibernate.cfg.Environment INFO: HHH000206: hibernate.properties not found Apr 29, 2013 5:31:24 PM org.hibernate.cfg.Environment buildBytecodeProvider INFO: HHH000021: Bytecode provider name : javassist Apr 29, 2013 5:31:24 PM org.hibernate.ejb.Ejb3Configuration configure INFO: HHH000204: Processing PersistenceUnitInfo [ name: default …] Apr 29, 2013 5:31:24 PM org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator instantiateExplicitConnectionProvider INFO: HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider Apr 29, 2013 5:31:25 PM org.hibernate.dialect.Dialect INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect Apr 29, 2013 5:31:25 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory Apr 29, 2013 5:31:25 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory INFO: HHH000397: Using ASTQueryTranslatorFactory Apr 29, 2013 5:31:25 PM org.hibernate.validator.internal.util.Version INFO: HV000001: Hibernate Validator 4.3.1.Final Apr 29, 2013 5:31:25 PM org.hibernate.tool.hbm2ddl.SchemaExport execute INFO: HHH000227: Running hbm2ddl schema export Hibernate: drop table if exists Item Hibernate: create table Item (id bigint not null auto_increment, name varchar(255), primary key (id)) Apr 29, 2013 5:31:25 PM org.hibernate.tool.hbm2ddl.SchemaExport execute INFO: HHH000230: Schema export complete Exception in thread «main» java.lang.NullPointerException at devopsdistilled.operp.server.ServerApp.sampleMethod(ServerApp.java:27) at devopsdistilled.operp.server.ServerApp.main(ServerApp.java:20)

Как видно на выходе, существует NullPointerException и, следовательно, ItemRepository не Autowired.

Я написал Test для репозитория следующим образом.

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = JpaContext.class) @Transactional public class ItemRepositoryTest { @Inject private ItemRepository itemRepository; private Item item; @Before public void setUp() throws Exception { item = new Item(); item.setName(«Test Item»); } @Test public void testSave() { item = itemRepository.save(item); Assert.assertEquals(item, itemRepository.findOne(item.getId())); }

}

код >

Что отсутствует в моей конфигурации?

Как я могу решить эту проблему?

Спасибо

Лучший ответ:

Я считаю, что проблема заключается в этой строке:

new ServerApp().sampleMethod();

Когда вы вызываете из основного, вы все равно можете полагаться на автосогласование, но вам нужно использовать ApplicationContext для извлечения bean.

Вот так:

ServerApp app = context.getBean(«ServerApp»);

Примечание Важно отметить, что эта функция перегружена, поэтому вам может быть повезло с перегрузкой

Когда вы используете ключевое слово new, вы обходите Spring и используете чистую Java-копию.

Ответ №1

Вы пытались объявить свой репозиторий с помощью дженериков JpaRepository как explaneid в документах?

@Repository public interface ItemRepository extends JpaRepository<Item, Long> { }

В моем случае он не работает без указания идентификатора и типа объекта. Надеюсь, это поможет.

Кроме того, если вы хотите инициализировать свои репозитории вручную в своем тесте, используйте что-то вроде этого:

@Before public void init() { JpaRepositoryFactory jpaRepositoryFactory = new JpaRepositoryFactory(entityManager); yourRepository = jpaRepositoryFactory.getRepository(YourRepository.class); assertNotNull(yourRepository); // In case your need to initialize a custom repository use this OtherRepositoryCustom otherRepoImpl = new OtherRepositoryImpl(); otherRepository = jpaRepositoryFactory.getRepository(OtherRepository.class, otherRepoImpl); assertNotNull(otherRepository); }

Оцените статью
Добавить комментарий