J'aimerais utiliser spring-data-jpa et CrudRepository<T, ID extends Serializable>
. Mais je ne peux pas le faire virer automatiquement. (tous les autres services du même package sont câblés correctement):
@Service
public class UserService {
@Resource
private UserRepo repo;
//this does neither work
//@Autowired
//private CrudRepository<User, Long> repo;
}
public interface UserRepo extends CrudRepository<User, Long> {
}
@Entity
public class User {
@Id
private Long id;
}
Résultat:
Causé par: org.springframework.beans.factory.BeanCreationException: Erreur lors de la création du bean nommé 'userService': Injection de la ressource les dépendances ont échoué; exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: No Bean qualifiant de type [UserRepo] trouvé pour la dépendance: attendu à au moins 1 haricot qui se qualifie comme candidat autowire pour cela dépendance. Annotations de dépendance: {@ javax.annotation.Resource (shareable = true, mappedName =, description =, name =, type = classe Java.lang.Object, lookup =, authenticationType = CONTAINER)}
Qu'est-ce qui ne va pas ici?
D'après les documents, je pense que cela devrait fonctionner sans écrire une implémentation:
Dans une application Java typique, vous vous attendez à écrire une classe qui implémente CustomerRepository. Mais c’est ce qui fait que Spring Data JPA si puissant: il n’est pas nécessaire d’écrire une implémentation du fichier interface de référentiel. Spring Data JPA crée une implémentation sur le fichier voler lorsque vous exécutez l'application.
SpringConfig mis à jour:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("my.package")
public class AppConfig {
@Bean
public LocalContainerEntityManagerFactoryBean emf() throws ClassNotFoundException, PropertyVetoException {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(dataSource());
emf.setPackagesToScan("my.package");
emf.setJpaVendorAdapter(jpaAdapter());
emf.setJpaProperties(jpaProterties());
return emf;
}
}
Résultat: il manque un fichier emf, ce qui est étrange, car je dispose déjà de serices DAO en état de fonctionnement sur lesquels je peux automatiquement transférer EntityManager
et EMF
sans aucun problème.
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1a6e658': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.Java:336)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.Java:108)
at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.Java:632)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.Java:442)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.Java:1094)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.Java:989)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:504)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:475)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.Java:276)
... 50 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.Java:641)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.Java:1159)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:282)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:195)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.Java:328)
... 58 more
Vous devriez vérifier les points suivants:
1) Annotez la UserRepo
avec @Repository
.
2) Votre fichier XML haricots de printemps devrait avoir:
<jpa:repositories base-package="your.repository.package"></jpa:repositories>
3) Je recommanderais d'injecter ce type de bean avec @Autowired
au lieu de @Resource
METTRE &AGRAVE; JOUR
il semble que vous ayez fait mes 3 premières étapes et que vous avez maintenant une longueur d’avance. Maintenant, rappelez-vous que dans les méthodes de configuration Java, les nomsDOmatter. Changez emf()
en entityManagerFactory()
(qui est plus "standard") ou définissez entity-manager-factory-ref
en emf
. Exemple:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws ClassNotFoundException, PropertyVetoException {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(dataSource());
emf.setPackagesToScan("my.package");
emf.setJpaVendorAdapter(jpaAdapter());
emf.setJpaProperties(jpaProterties());
return emf;
}
UserRepo ne doit-il pas être annoté avec:
@Repository
Ce doit être un problème dans votre configuration applicationContext. Voici celui que j'ai utilisé pour le faire fonctionner:
<jpa:repositories
base-package="package.containing.your.repositories"
factory-class="org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean"
transaction-manager-ref="transactionManager"
entity-manager-factory-ref="entityManagerFactory" />
<bean
id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory" />
<bean
id="hibernateJpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
<bean
id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource"
p:persistenceUnitName="PU"
p:jpaVendorAdapter-ref="hibernateJpaVendorAdapter"
p:jpaProperties="classpath:hibernate.properties" />
<util:property-path id="sessionFactory" path="entityManagerFactory.sessionFactory" />
Configuration des données de printemps JPA à l'aide de XML et d'annotations
//This is the two way to configure spring data JPA
@EnableJpaRepositories (basePackages= "Repository Bean is located in package", entityManagerFactoryRef= "Here is your configuration of EntityManagerFactoryBean")
<jpa:repositories base-package= "Repository Bean where package"
Entity-manager-factory-ref= "Here is your configured EntityManagerFactoryBean" ></jpa:repositories>
// Sample code:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages="com.zxg.springdata",
entityManagerFactoryRef="factoryBean")
public class SpringDataConfig {
@Bean
public LocalContainerEntityManagerFactoryBean factoryBean (
ComboPooledDataSource dataSource, JpaVendorAdapter jpaVendorAdapter
){
LocalContainerEntityManagerFactoryBean factoryBean = new
LocalContainerEntityManagerFactoryBean ();
FactoryBean.setDataSource (dataSource);
FactoryBean.setJpaVendorAdapter (jpaVendorAdapter);
FactoryBean.setPackagesToScan ("com.zxg.springdata");
Return factoryBean;
}
}