web-dev-qa-db-fra.com

Comment injecter CrudRepository dans Spring JPA?

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
16
membersound

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;
    }
16
Shay Elkayam

UserRepo ne doit-il pas être annoté avec:

 @Repository
1
Eugene

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" />
1
sp00m

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;
       }
    }
0
Zhang_Ucan