Spring jpa在尝试配置数据源时无法生成Hibernate SessionFactory错误

Spring jpa在尝试配置数据源时无法生成Hibernate SessionFactory错误,spring,spring-security,spring-data-jpa,Spring,Spring Security,Spring Data Jpa,我有一个用户名/密码库,我正试图使用customUserDetailsService将其配置到SpringWeb安全性中。我的基本包名为“showcase” 我的Web安全配置为: @Configuration @EnableWebSecurity public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired private DataSource datasource; @Aut

我有一个用户名/密码库,我正试图使用customUserDetailsService将其配置到SpringWeb安全性中。我的基本包名为“showcase”

我的Web安全配置为:

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

@Autowired
private DataSource datasource;

@Autowired
private CustomUserDetailsService customUserDetailsService;
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.jdbcAuthentication().dataSource(datasource)
                .and()
                .userDetailsService(customUserDetailsService);

        // @formatter:on
    }
我正在尝试按如下方式配置此数据源:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {
    "showcase"
})
public class DatabaseConfig {
//@Resource
private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql";
private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
private static final String PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY = "hibernate.ejb.naming_strategy";
private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";

@Bean
public DataSource dataSource(Environment env) {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("java.sql.DriverManager");
    dataSource.setUrl("jdbc:mysql://localhost:3306/mutibodb");
    dataSource.setUsername("db");
    dataSource.setPassword("");

    return dataSource;
}

@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, Environment env) {
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactoryBean.setDataSource(dataSource);
    entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
    entityManagerFactoryBean.setPackagesToScan("showcase");

    Properties jpaProperties = new Properties();

    jpaProperties.put(PROPERTY_NAME_HIBERNATE_DIALECT,"showcase.MySQLDialect");
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO,"create-drop");
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY,"org.hibernate.cfg.ImprovedNamingStrategy");
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL,false);
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL,true);


    entityManagerFactoryBean.setJpaProperties(jpaProperties);

    return entityManagerFactoryBean;
}

@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory);
    return transactionManager;
}
}

SQL方言配置如下所示:

public class MySQLDialect extends MySQL5InnoDBDialect {
@Override
public String getDropSequenceString(String sequenceName) {

    return "drop sequence if exists " + sequenceName;
}

@Override
public boolean dropConstraints() {

    return false;
}
我得到一个错误,主要是:
无法构建Hibernate SessionFactory

我是春天的新手,一定错过了什么。我不使用任何基于xml的配置,只希望使用java配置。如果需要,我可以分享代码其余部分的详细信息

更新: 这是我的CustomUserDetails服务:

@Service("userDetailsService")
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
AppUserRepository repository;

@Autowired
private UserService userService;


private static final Logger logger = LoggerFactory.getLogger(CustomUserDetailsService.class);

@Override
public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
    logger.info("username:"+name);
            AppUser u = repository.findByUserName(name);
    if (u == null)
        throw new UsernameNotFoundException("User details not found with this username: " + name);
    String username = u.getUsername();
    String password = u.getPassword();
    List authList = new ArrayList();
    authList.add(new SimpleGrantedAuthority("USER"));

    User user = new User(username, password, authList);

    return user;
}
上面提到的UserService将用户保存在AppUserRepository中。AppUser是一个实体

The entire error is:
2014-12-28 12:02:59.555  INFO 5220 --- [ost-startStop-1] org.hibernate.Version                    : HHH000412: Hibernate Core {4.3.1.Final}

2014-12-28 12:02:59.557  INFO 5220 --- [ost-startStop-1] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found

2014-12-28 12:02:59.560  INFO 5220 --- [ost-startStop-1] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist

2014-12-28 12:02:59.722  INFO 5220 --- [ost-startStop-1] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {4.0.4.Final}

2014-12-28 12:02:59.753  WARN 5220 --- [ost-startStop-1] o.h.e.jdbc.internal.JdbcServicesImpl     : HHH000342: Could not obtain connection to query metadata : No suitable driver found for jdbc:mysql://localhost:3306/mutibodb

2014-12-28 12:02:59.760  INFO 5220 --- [ost-startStop-1] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: showcase.MySQLDialect

2014-12-28 12:02:59.767  INFO 5220 --- [ost-startStop-1] o.h.e.jdbc.internal.LobCreatorBuilder    : HHH000422: Disabling contextual LOB creation as connection was null

2014-12-28 12:02:59.835 ERROR 5220 --- [cat-startStop-1] org.apache.catalina.core.ContainerBase   : A child container failed during start

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:799)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    ... 6 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.setFilterChainProxySecurityConfigurer(org.springframework.security.config.annotation.ObjectPostProcessor,java.util.List) throws java.lang.Exception; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSecurityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private showcase.CustomUserDetailsService showcase.WebSecurityConfiguration.customUserDetailsService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDetailsService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: showcase.AppUserRepository showcase.CustomUserDetailsService.repository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appUserRepository': Cannot create inner bean '(inner bean)#165fa72a' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#165fa72a': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [showcase/DatabaseConfig.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory

我以前没有关注hibernate错误。我想我的hibernate配置是错误的。但是有没有一种不用注入数据源就可以做到这一点的方法呢?当我在securrity配置中没有datasource字段并且只使用auth.userDetailsService(customUserDetailsService)时,我得到了一个
没有定义[javax.sql.datasource]类型的合格bean的错误。试图解决这一问题会将我引向这条道路。

实现CustomUserDetailsService在哪里?仔细阅读异常,无法自动连接CustomUserDetailsService。首先,您的安全配置有错误。无论是指定自定义userdetailsservice还是插入数据源,都不能同时执行这两项操作。接下来,您应该注入一个
UserDetailsService
,因为您应该编程到接口,而不是具体的类。你发布的是完整的堆栈跟踪吗?我希望从hibernate获得更多信息。我更新了更多信息。你能看一下吗。如果可以在不插入数据源的情况下修复此问题,则会很有帮助。如果您有一个类型为
DataSource
的字段,则需要删除该字段。@M.Deinum I已更改我的代码,更新的部分位于。你能看一下吗。我似乎仍然得到一个错误,即
工厂方法[public org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.entityManagerFactory(org.springframework.orm.jpa.JpaVendorAdapter)]抛出异常;嵌套异常为org.springframework.beans.factory.NoSuchBean定义异常:未定义[javax.sql.DataSource]类型的合格bean
。我也更新了那里的完整错误。