J'essayais de connecter l'application à ma base de données mais lorsque j'essaye de l'exécuter, j'obtiens cette erreur:

Erreur lors de la création du bean avec le nom 'barcodeIngDao': dépendance non satisfaite exprimée par le paramètre 0 de la méthode setSessionFactory '; l'exception imbriquée est org.springframework.beans.factory.UnsatisfiedDependencyException: Erreur lors de la création du bean avec le nom 'sessionFactory' défini dans le serveur.Application: Dépendance non satisfaite exprimée par le paramètre 0 de la méthode 'sessionFactory'; l'exception imbriquée est org.springframework.beans.factory.BeanCurrentlyInCreationException: Erreur lors de la création du bean avec le nom 'sessionFactory': Le bean demandé est actuellement en cours de création: Y a-t-il une référence circulaire impossible à résoudre?

Le barcodeIngDao est juste une classe avec @Repository qui étend GenericDaoHibernate:

package server.util;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

import server.exceptions.InstanceNotFoundException;

public class GenericDaoHibernate<E, PK extends Serializable> implements
GenericDao<E, PK> {

    private SessionFactory sessionFactory;

    private Class<E> entityClass;

    @SuppressWarnings("unchecked")
    public GenericDaoHibernate() {
        this.entityClass = (Class<E>) ((ParameterizedType) getClass()
                .getGenericSuperclass()).getActualTypeArguments()[0];
    }

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }

    public void save(E entity) {
        getSession().saveOrUpdate(entity);
    }

    public E find(PK id) throws InstanceNotFoundException {
        E entity = (E) getSession().get(entityClass, id);
        if (entity == null) {
            throw new InstanceNotFoundException(id, entityClass.getName());
        }
        return entity;
    }

    public void remove(PK id) throws InstanceNotFoundException {
        getSession().delete(find(id));
    }

}

Ceci est mon Application.java:

package server;

import javax.persistence.EntityManagerFactory;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean;

@SpringBootApplication(exclude=HibernateJpaAutoConfiguration.class)
public class Application {

    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
        HibernateJpaSessionFactoryBean fact = new HibernateJpaSessionFactoryBean();
        fact.setEntityManagerFactory(emf);
        return fact;
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Et voici mon application.properties:

spring.datasource.url=jdbc:postgresql://localhost:5432/AppRecipe?useSSL=false
spring.datasource.username=uibRT
spring.datasource.password=uibRT
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext

Je comprends que mon Application.java avec @ComponentScan dans @SpringBootApplication essaie de créer le bean pour barcodeIngDao à cause du @Repository, et que le barcodeIngDao étend le GenericDaoHibernate afin qu'il essaie de créer le bean pour SessionFactory lorsque Application.java est toujours à l'étape d'analyse, donc il n'a pas encore créé le bean pour SessionFactory.

Le problème c'est que je ne sais pas s'il existe un moyen de créer le bean pour la SessionFactory avant de scanner toutes les classes, ou si je fais quelque chose de mal et ce n'est pas ce que j'ai dit auparavant

Modifier Si j'essaye de ceci:

package server.barcodeing;

import javax.persistence.EntityManagerFactory;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import server.util.GenericDaoHibernate;

@Repository("barcodeIngDao")
public class BarcodeIngDaoHibernate extends
        GenericDaoHibernate<BarcodeIng, Long> implements BarcodeIngDao {

    @Autowired 
    private EntityManagerFactory entityManagerFactory;

    public SessionFactory getSessionFactory(){
        return this.entityManagerFactory.unwrap(SessionFactory.class);
    }

}

Je reçois cette erreur:

Erreur lors de la création du bean avec le nom «barcodeIngDao»: Dépendance non satisfaite exprimée par le paramètre 0 de la méthode «setSessionFactory»; l'exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean éligible de type 'org.hibernate.SessionFactory' disponible: attendu au moins 1 bean qui se qualifie comme candidat autowire.

Modifier2

Si je supprime le exclude = HibernateJpaAutoConfiguration.class dans Application.java, j'obtiens cette erreur:

Erreur lors de la création du bean avec le nom 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Dépendance non satisfaite exprimée via le paramètre de constructeur 0; l'exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean éligible de type 'javax.sql.DataSource' disponible: attendu au moins 1 bean qui se qualifie comme candidat autowire.

Modifier3

Si je remplace la méthode SessionFactory dans Application.java pour cela:

@Bean
public SessionFactory sessionFactory(@Qualifier("entityManagerFactory") EntityManagerFactory emf) {
     return emf.unwrap(SessionFactory.class);
}

Je reçois cette erreur:

Erreur lors de la création du bean avec le nom «barcodeIngDao»: Dépendance non satisfaite exprimée par le paramètre 0 de la méthode «setSessionFactory»; l'exception imbriquée est org.springframework.beans.factory.UnsatisfiedDependencyException: Erreur lors de la création du bean avec le nom 'sessionFactory' défini dans le serveur.Application: Dépendance non satisfaite exprimée par le paramètre 0 de la méthode 'sessionFactory'; l'exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean éligible de type 'javax.persistence.EntityManagerFactory' disponible: attendu au moins 1 bean qui se qualifie comme candidat autowire. Annotations de dépendance: {@org.springframework.beans.factory.annotation.Qualifier (value = entityManagerFactory)}

Modifier4

Avec l'édition et l'édition 2 après avoir mis cette dépendance dans le pom, je peux exécuter le serveur:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

Le problème maintenant c'est lorsque j'essaye de faire une demande que j'obtiens cette erreur:

Servlet.service () pour le servlet [dispatcherServlet] dans le contexte du chemin [] a lancé une exception [Le traitement de la demande a échoué; l'exception imbriquée est java.lang.NullPointerException] avec la cause racine java.lang.NullPointerException à server.util.GenericDaoHibernate.getSession (GenericDaoHibernate.java:33)

Erreur complète:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException
    at server.util.GenericDaoHibernate.getSession(GenericDaoHibernate.java:33)
    at server.util.GenericDaoHibernate.find(GenericDaoHibernate.java:41)
        at server.util.GenericDaoHibernate$$FastClassBySpringCGLIB$$eda6dc96.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
        at server.recipe.RecipeDaoHibernate$$EnhancerBySpringCGLIB$$1857692b.find(<generated>)
        at server.recipeservice.RecipeServiceImpl.findRecipeById(RecipeServiceImpl.java:26)
        at server.recipeservice.RecipeServiceImpl$$FastClassBySpringCGLIB$$1b7b075.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
        at server.recipeservice.RecipeServiceImpl$$EnhancerBySpringCGLIB$$14ef69a4.findRecipeById(<generated>)
        at server.controllers.RecipeController.recipeId(RecipeController.java:33)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
0
arqsartax 25 nov. 2017 à 03:43

3 réponses

Meilleure réponse

J'ai finalement résolu le problème en supprimant GenericDaoHibernate et en changeant les extensions de barcodeIngDao en CrudRepository:

public interface BarcodeIngRepository extends CrudRepository<BarcodeIng, Long>{

}
0
arqsartax 30 nov. 2017 à 11:31

Vous devriez renvoyer une instance SessionFactory au lieu de HibernateJpaSessionFactoryBean. Essayez de remplacer la méthode de fabrique de session comme suit.

@Bean
public SessionFactory sessionFactory(@Qualifier("entityManagerFactory") EntityManagerFactory emf) {
     return emf.unwrap(SessionFactory.class);
}

Ici est la documentation associée.

0
Srikanth Anusuri 25 nov. 2017 à 02:32

Vous pouvez essayer de déballer SessionFactory dans chaque classe DAO.

Ça marche pour moi ..

@Autowired private EntityManagerFactory entityManagerFactory;

public SessionFactory getSessionFactory(){
    return this.entityManagerFactory.unwrap(SessionFactory.class);
}

Vous essayez de créer @autowired dans la méthode setSessionFactory et de lancer

Dépendance non satisfaite exprimée par la méthode 'setSessionFactory'

Supprimez-le et commentez la définition du bean SessionFactory.

Et je vois que vous n'utilisez pas l'autoconfiguration Jpa

@SpringBootApplication(exclude=HibernateJpaAutoConfiguration.class)

Supprimez également le paramètre d'exclusion.

MODIFIER 2: ajoutez ceci dans votre MainClass

@PropertySource({"classpath:application.properties"})

Est possible qu'il ne lit pas le fichier application.properties.

2
Jorge L. Morla 25 nov. 2017 à 02:22
47481631