2017-03-13 2 views
0

Ich bin eine Anwendung von Jersey Migration 1.18, Frühling 3, Hibernate 3.6, Maven zu einer völlig neuen Architektur: Frühling 4.3 (via Frühling Boot), Hibernate 5 und Gradel.Migration von Migrate to Spring MVC 4 + Hibernate5

Während der „Portierung“ des Frühlings application.xml auf eine Codebasiskonfiguration, ich die folgende Ausnahme gegenüber:

Fehler Bean mit dem Namen ‚jpaContext‘ zu erstellen: Unbefriedigend Abhängigkeit. .. Keine Warte Bohne für Abhängigkeits [java.util.Set] gefunden

Hier ist die lange stacktrace

2017-03-13 19:44:42.814 WARN 40010 --- [   main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jpaContext': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean found for dependency [java.util.Set<javax.persistence.EntityManager>]: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 
2017-03-13 19:44:42.816 INFO 40010 --- [   main] o.s.j.e.a.AnnotationMBeanExporter  : Unregistering JMX-exposed beans on shutdown 
2017-03-13 19:44:42.825 INFO 40010 --- [   main] o.apache.catalina.core.StandardService : Stopping service Tomcat 
2017-03-13 19:44:42.860 INFO 40010 --- [   main] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled. 
2017-03-13 19:44:42.995 ERROR 40010 --- [   main] o.s.b.d.LoggingFailureAnalysisReporter : 

*************************** 
APPLICATION FAILED TO START 
*************************** 

Description: 

Parameter 0 of constructor in org.springframework.data.jpa.repository.support.DefaultJpaContext required a bean of type 'java.util.Set' that could not be found. 


Action: 

Consider defining a bean of type 'java.util.Set' in your configuration. 

Tatsache ist, dass ich nicht die DefaultJpaContext in meinem Code definiert haben:

@Configuration 
@EnableTransactionManagement 
@EnableAspectJAutoProxy(proxyTargetClass = true) 
public class DatabaseConfig { 

    @Autowired private Environment env; 
    @Autowired private DataSource dataSource; 
    @Autowired private SessionFactory sessionFactory; 

    private static final String DB_DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver"; 
    private static final String HIBERNATE_DIALECT = "org.hibernate.dialect.MySQL5Dialect"; 
    private static final String HIBERNATE_VALIDATION = "validate"; 
    private static final String SHOW_SQL    = "false"; 
    private static final String ENTITY_PACKAGE  = MainEntity.class.getPackage().getName(); 

    final Logger log = LoggerFactory.getLogger(DatabaseConfig.class); 


    @Bean 
    public DataSource dataSource() { 
     final String driverName = env.getProperty("db.driver", DB_DRIVER_CLASS_NAME); 
     final String url  = env.getProperty("db.url"); 
     final String username = env.getProperty("db.username"); 
     final String password = env.getProperty("db.password"); 
     final DriverManagerDataSource dataSource = new DriverManagerDataSource(); 

     if (log.isInfoEnabled()) { 
      log.info("Database Configuration:"); 
      log.info("Setting driverName to {}", driverName); 
      log.info("Setting url to {}", url); 
      log.info("Setting username to {}", username); 
      if (StringUtils.isEmpty(password)) log.warn("Password not specified"); 
      else log.info("Setting password"); 
     } 

     dataSource.setDriverClassName(driverName); 
     dataSource.setUrl(url); 
     dataSource.setUsername(username); 
     dataSource.setPassword(password); 
     return dataSource; 
    } 

    @Bean 
    public LocalSessionFactoryBean sessionFactory(){ 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource); 
     sessionFactory.setPackagesToScan(new String[] {ENTITY_PACKAGE}); 

     // Hibernate properties 
     Properties additionalProperties = new Properties(); 
     additionalProperties.put("hibernate.dialect"  , env.getProperty("db.dialect" , HIBERNATE_DIALECT)); 
     additionalProperties.put("hibernate.hbm2ddl.auto", env.getProperty("db.validation", HIBERNATE_VALIDATION)); 
     additionalProperties.put("hibernate.show_sql" , env.getProperty("db.sql.show" , SHOW_SQL)); 

     sessionFactory.setHibernateProperties(additionalProperties); 
     return sessionFactory; 
    } 

    @Bean 
    public HibernateTransactionManager transactionManager(){ 
     HibernateTransactionManager transactionManager = new HibernateTransactionManager(); 
     transactionManager.setSessionFactory(sessionFactory); 
     return transactionManager; 
    } 
} 

aktualisieren

Hier ist es ein Stück gradle Build ist:

compile('org.springframework.boot:spring-boot-starter-data-jpa') 
// ... 
compile('org.springframework.boot:spring-boot-starter-security') 
compile('org.springframework.boot:spring-boot-starter-web') 
compile group: 'org.hibernate'  , name: 'hibernate-core'  , version: '5.2.8.Final' 
// ... 

Was ich fehlt?

Danke, Davide.

+0

'DefaultJpaContext' ist in der Autokonfiguration definiert. Führen Sie die Debugfunktion aus, wie im Fehlerbericht empfohlen, um Details anzuzeigen. Aber was Sie tun, ist nicht notwendig. Alle Eigenschaften können in 'application.properties' definiert werden und Spring-Boot wird es aufnehmen. – jny

Antwort

0

Basierend auf der Spring-Boot-Fehlermeldung kann die DefaultJpaContext-Bean nicht erstellt werden, deren Konstruktor Set<javax.persistence.EntityManager> entityManagers erfordert.

Sieht aus wie Sie Spring-Data Abhängigkeit in Ihrem pom.xml (oder build.gradle) haben, die die JPA erfordert EntityManagerFactory, während Sie Hibernate (LocalSessionFactoryBean) Sachen haben. Müssen Sie DefaultJpaContext Bohnen haben?

+0

Ja, ich habe Spring-Boot-Starter-Daten-JPA-Abhängigkeit, aber ohne ich habe keine @Transactional Annotation zur Verfügung. Ich brauche den Entity Manager nicht wirklich, da ich SessionFactory in diesem Projekt verwende. – Davide

+0

Wenn Ihr Problem nur mit '@ Transactional'-Annotation auftritt, fügen Sie einfach' spring-tx' als Ihre Abhängigkeit hinzu. Der Punkt hier ist versuchen, die von Ihnen deklarierte Abhängigkeit zu minimieren. Das ist einer der wenigen * Nachteile * mit 'Spring-boot', bei dem wir blindlings eine Reihe von' Startern' deklarieren, die manchmal eine Menge Abhängigkeiten einführen, die wir eigentlich nicht brauchen. Wie hier in Ihrem Fall, brauchen Sie JPA nicht, sondern nur verwandte Gläser im Winterschlaf, dann brauchen Sie diese jpa-Starter nicht anzufassen. –

Verwandte Themen