Вопрос:
Я пробовал 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); }