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 laItemRepository
n'est pasAutowired
.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
Vous devez vous connecter pour publier un commentaire.
Je crois que le problème est cette ligne:
Lorsque vous appelez à partir d'un principal, vous pouvez toujours compter sur permettra à l'autowiring, mais vous devez utiliser le
ApplicationContext
pour récupérer les grains.Comme ceci:
Note Il est important de noter que cette fonction est surchargé, vous pouvez avoir plus de chance avec la surcharge
Lorsque vous utilisez le
new
mot-clé, vous êtes en contournant Printemps et en utilisant Java pur de l'instanciation.ServerApp
il n'y a pas d'erreurs. Mais mon vrai problème c'est quand j'écris un test pour le Référentiel. Je vais mettre à jour ma question.ok laissez-moi savoir quand.
Aucune idée de la raison principale méthode '@Autowire " ne fonctionne pas? J'ai eu beaucoup de mal avec cela. J'avais Exception de pointeur Null sauf si j'utilise ApplicationContext pour récupérer les grains.
OriginalL'auteur Woot4Moo
Avez-vous essayé de déclarer votre référentiel à l'aide de la JpaRepository génériques comme explaneid dans les docs?
Dans mon cas ça ne fonctionne pas sans spécifier l'ID et le type de l'entité. Espérons que cette aide.
En outre, si vous souhaitez initialiser vos dépôts manuellement dans votre test, utiliser quelque chose comme ceci:
Merci pour votre suggestion concernant le test, mais je ne suis pas familier au sujet de l'avantage de tester une telle façon. Aussi, je commence TDD juste aujourd'hui.
Le seul avantage est qu'aucun référentiel n'est pas initialisé, mais ceux que vous avez manuellement déclarer dans
@Before
méthode. Cela augmente la vitesse de votre test si vous avez donc beaucoup de dépôts, parce que vous êtes juste l'initialisation de ceux dont vous avez besoin.Merci 🙂 Est-il d'autres réglages que vous pouvez fournir à modifier mon
ApplicationContext
. J'ai douter de sa foiré certains comment.OriginalL'auteur jelies