Hoe te injecteren CrudRepository in het Voorjaar van PPV?

Ik wil graag gebruik maken van de lente-data-ppv en CrudRepository<T, ID extends Serializable>. Maar ik kan het niet krijgen autowired. (alle andere services die in hetzelfde pakket zijn juist aangesloten):

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

Resultaat:

Veroorzaakt door: org.springframework.bonen.de fabriek.BeanCreationException:
Fout bij het maken van boon met de naam ‘userService’: Injectie van resource
afhankelijkheden mislukt; geneste uitzondering is
org.springframework.bonen.de fabriek.NoSuchBeanDefinitionException: Geen
de kwalificatie van de boon van het type [UserRepo] gevonden voor afhankelijkheid: verwacht
minste 1 van de boon die in aanmerking komt als kandidaat voor deze autowire
afhankelijkheid. Afhankelijkheid annotaties:
{@javax.annotatie.Bron(shareable=true, mappedName=, description=,
naam=, type=class java.lang.Object lookup=,
authenticationType=CONTAINER)}

Wat zou hier mis?

Van de docs ik denk dat het zou moeten werken zonder het schrijven van een implementatie:

In een typische Java-toepassing, zou je verwachten dat aan het schrijven van een klasse die
implementeert CustomerRepository. Maar dat maakt de Lente Gegevens JPA
zo krachtig is: U hoeft niet te schrijven, een implementatie van de
archief interface. De lente Gegevens JPA maakt een implementatie op de
vliegen wanneer u de toepassing uitvoert.


Bijgewerkt SpringConfig:

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

Resultaat: emf ontbreekt, dat is vreemd, zoals ik al werken DAO serices waar ik kan autowire EntityManager en EMF zonder enig probleem.

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
  • Heb je enig uitvoering van UserRepo?
  • Nee, ik wil om gebruik te maken van de standaard query-toewijzing die is opgegeven door het gebruik van deze lente-interface.
  • Gelieve te posten uw Spring-configuratie. Heb je de repository-ondersteuning is ingeschakeld?
  • Nee, ik niet. Hoewel het niet helpen, zie de update boven
  • Je moet bellen met het entityManagerFactory of wijzigen van de entiteit-manager-factory-ref naar “emf”

 

4 Replies
  1. 16

    U moet u het volgende controleren:

    1) Aantekeningen te maken op het UserRepo met @Repository.

    2) de lente bonen xml-bestand moet in het:

    <jpa:repositories base-package="your.repository.package"></jpa:repositories>

    3) ik zou adviseren het injecteren van dit soort boon met @Autowired in plaats van @Resource

    UPDATE

    het lijkt erop dat je deed mijn eerste 3 stappen en je bent één stap vooruit nu. Nu, vergeet niet dat in de Java-Config methoden namen DOEN kwestie. Wijzig emf() te entityManagerFactory() (dat is meer “standaard”), of zet entity-manager-factory-ref te emf. Voorbeeld:

    @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;
        }
    • OK ik heb u voorgesteld, zie mijn bijgewerkt antwoord hierboven als is er nog een probleem…
    • Ik heb al commentaar daar. wijzig de naam van “emf” naar “entityManagerFactory”, of het instellen van entiteit-manager-factory-ref=emf
    • Geweldig, dat deed de truc! Wist niet dat het voorjaar is strikt over de @Bean methode naamgeving hier.
    • De naam van de methode dient eigenlijk als de boon naam, gelijk aan de xml-s <boon id=”entityManagerFactory” …. />
    • Ok bedankt. Gewoon toe te voegen: ik heb niet te gebruiken annotatie @Repository voor de interface. Een duidelijke interface is voldoende.
  2. 1

    Niet UserRepo moet worden geannoteerd met :

     @Repository
    • en u scant alles goed, toch? context:component-scan
    • Ja, zoals ik schreef andere klassen in dezelfde package zijn juist aangesloten.
    • en heb je dit ook? <ppv:repositories basis-pakket
    • Nee, ik had deze niet. We zijn dus een stap vooruit. Hoewel nu de EMF is niet gevonden…
    • dit klinkt als een andere vraag. Accepteren (of niet) van een antwoord en een nieuwe te beginnen denk ik. Ook de uitzondering zegt het al, de Lente niet kunt vinden, zoals een boon..
  3. 1

    Het moet een probleem zijn in uw applicationContext configuratie. Hier is degene die ik vroeger maakte het werk:

    <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" />
  4. 0

    Het configureren van de lente gegevens JPA het gebruik van XML en aantekeningen

    //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;
           }
        }

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *