Spring data JPA Référentiel @autocâblés donne null

J'ai essayé spring-data-jpa. Avec l'aide de La Documentation De Référence et mon avant printemps de connaissances, j'ai mis en place spring-data-jpa configuration, mais le Repository que je @Autowired est toujours retourné null. J'ai consulter les autres questions ici, mais je n'ai pas trouver la solution.

Mon ApplicationContext configuration est


@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();
}
}

Mon Entité définition est la suivante


@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());
}

}

Mon Référentiel définition est la suivante


@Repository
public interface ItemRepository extends JpaRepository {
}

Alors que j'essaie d'exécuter un exemple d'application comme suit

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");
}

}

- Je obtenir la sortie suivante dans la console.


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)

Comme il peut être vu dans la production, il existe NullPointerException et donc la ItemRepository n'est pas Autowired.

J'ai écrit un Test pour le Référentiel comme suit.


@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()));
}

}


Ce qui est manquant dans ma configuration?

Comment puis-je résoudre ce problème?

Grâce

avez-vous un test de configuration de chargement? Ou est-ce la même configuration pour toutes les pièces de la demande>
Il en est de même de la configuration.
Je vois. Pouvez-vous créer un test fichier de configuration? Il est bénéfique dans le long terme pour avoir un de ces parce que votre environnement de test seront plus susceptibles de persister dans un emplacement de mémoire et pas un "vrai" de la base de données. Aussi, je pense que ça va nous aider à traquer le problème sous-jacent.
En fait j'ai simplement commencé à écrire le Test aujourd'hui, donc très peu de connaissances. J'ai pensé à écrire des configurations distinctes, mais je m'en tiens à ce qui fait que j'ai droit à spring-data-jpa configuration d'abord, puis l'optimisation de l'environnement de test.

OriginalL'auteur TheKojuEffect | 2013-04-29