SpringMVC登录表单错误的shiro无法加载JDBC驱动程序类[oracle.JDBC.OracleDriver]

SpringMVC登录表单错误的shiro无法加载JDBC驱动程序类[oracle.JDBC.OracleDriver],spring,login,shiro,Spring,Login,Shiro,大家好,我正在尝试使用shiro和SpringMVC3构建登录表单 我得到以下错误 2015-03-06 17:42:05,097 DEBUG [org.apache.shiro.spring.LifecycleBeanPostProcessor] - Initializing bean [cacheManager]... 2015-03-06 17:42:05,098 DEBUG [org.apache.shiro.cache.ehcache.EhCacheManager] - ca

大家好,我正在尝试使用shiro和SpringMVC3构建登录表单 我得到以下错误

    2015-03-06 17:42:05,097 DEBUG [org.apache.shiro.spring.LifecycleBeanPostProcessor] - Initializing bean [cacheManager]... 
2015-03-06 17:42:05,098 DEBUG [org.apache.shiro.cache.ehcache.EhCacheManager] - cacheManager property not set.  Constructing CacheManager instance...  
2015-03-06 17:42:05,102 DEBUG [org.apache.shiro.io.ResourceUtils] - Opening resource from class path [org/apache/shiro/cache/ehcache/ehcache.xml] 
2015-03-06 17:42:05,148 TRACE [org.apache.shiro.cache.ehcache.EhCacheManager] - instantiated Ehcache CacheManager instance. 
2015-03-06 17:42:05,148 DEBUG [org.apache.shiro.cache.ehcache.EhCacheManager] - implicit cacheManager created successfully. 
2015-03-06 17:42:05,195 DEBUG [org.apache.shiro.spring.LifecycleBeanPostProcessor] - Destroying bean [cacheManager]... 
2015-03-06 17:42:05,201 ERROR [org.springframework.web.context.ContextLoader] - Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroFilter' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'securityManager' while setting bean property 'securityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'jdbcRealm' while setting bean property 'realm'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcRealm' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [oracle.jdbc.OracleDriver]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1325)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:722)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:410)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4701)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5204)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5199)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:662)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'jdbcRealm' while setting bean property 'realm'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcRealm' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [oracle.jdbc.OracleDriver]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1325)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
    ... 22 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcRealm' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [oracle.jdbc.OracleDriver]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1325)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
    ... 32 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [oracle.jdbc.OracleDriver]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
    ... 42 more
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [oracle.jdbc.OracleDriver]
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358)
    ... 50 more
application context.xml

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd>

<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> <property 
    name="url" value="jdbc:hsqldb:mem:shiro-spring" /> <property name="username" 
    value="sa" /> </bean> -->

<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"/> <property 
    name="url" value="jdbc:oracle:thin:@192.168.0.180:1521:ORCL"/> <property 
    name="username" value="DEVINTEGWALLET_V3"/> <property name="password" value="DEVINTEGWALLET_V3"/> 
    </bean> -->

<!-- Populates the sample database with sample users and roles. -->
<bean id="bootstrapDataPopulator" class="org.apache.shiro.samples.spring.BootstrapDataPopulator">
    <property name="dataSource" ref="dataSource" />
</bean>


<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    p:driverClassName="oracle.jdbc.OracleDriver" p:url="jdbc:oracle:thin:@192.168.0.180:1521:ORCL"
    p:username="DEVINTEGWALLET_V3" p:password="DEVINTEGWALLET_V3" />

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="cacheManager" ref="cacheManager" />
    <!-- Single realm app. If you have multiple realms, use the 'realms' property 
        instead. -->
    <property name="sessionMode" value="native" />
    <property name="realm" ref="jdbcRealm" />
</bean>

<!-- Let's use some enterprise caching support for better performance. You 
    can replace this with any enterprise caching framework implementation that 
    you like (Terracotta+Ehcache, Coherence, GigaSpaces, etc -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
    <!-- Set a net.sf.ehcache.CacheManager instance here if you already have 
        one. If not, a new one will be creaed with a default config: <property name="cacheManager" 
        ref="ehCacheManager"/> -->
    <!-- If you don't have a pre-built net.sf.ehcache.CacheManager instance 
        to inject, but you want a specific Ehcache configuration to be used, specify 
        that here. If you don't, a default will be used.: <property name="cacheManagerConfigFile" 
        value="classpath:some/path/to/ehcache.xml"/> -->
</bean>

<!-- Used by the SecurityManager to access security data (users, roles, 
    etc). Many other realm implementations can be used too (PropertiesRealm, 
    LdapRealm, etc. -->
<bean id="jdbcRealm"
    class="org.apache.shiro.samples.spring.realm.SaltAwareJdbcRealm">
    <property name="name" value="jdbcRealm" />
    <property name="dataSource" ref="dataSource" />
    <property name="credentialsMatcher">
        <!-- The 'bootstrapDataPopulator' Sha256 hashes the password (using the 
            username as the salt) then base64 encodes it: -->
        <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
            <property name="hashAlgorithmName" value="SHA-256" />
            <!-- true means hex encoded, false means base64 encoded -->
            <property name="storedCredentialsHexEncoded" value="false" />
        </bean>
    </property>
</bean>

<!-- ========================================================= Shiro Spring-specific 
    integration ========================================================= -->
<!-- Post processor that automatically invokes init() and destroy() methods 
    for Spring-configured Shiro objects so you don't have to 1) specify an init-method 
    and destroy-method attributes for every bean definition and 2) even know 
    which Shiro objects require these methods to be called. -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

<!-- Enable Shiro Annotations for Spring-configured beans. Only run after 
    the lifecycleBeanProcessor has run: -->
<bean
    class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
    depends-on="lifecycleBeanPostProcessor" />
<bean
    class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager" />
</bean>

<!-- Secure Spring remoting: Ensure any Spring Remoting method invocations 
    can be associated with a Subject for security checks. -->
<bean id="secureRemoteInvocationExecutor"
    class="org.apache.shiro.spring.remoting.SecureRemoteInvocationExecutor">
    <property name="securityManager" ref="securityManager" />
</bean>

<!-- Define the Shiro Filter here (as a FactoryBean) instead of directly 
    in web.xml - web.xml uses the DelegatingFilterProxy to access this bean. 
    This allows us to wire things with more control as well utilize nice Spring 
    things such as PropertiesPlaceholderConfigurer and abstract beans or anything 
    else we might need: -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager" />
    <property name="loginUrl" value="/login" />
    <property name="successUrl" value="/Done" />
    <property name="unauthorizedUrl" value="/unauthorized" />
    <!-- The 'filters' property is not necessary since any declared javax.servlet.Filter 
        bean defined will be automatically acquired and available via its beanName 
        in chain definitions, but you can perform overrides or parent/child consolidated 
        configuration here if you like: -->
    <!-- <property name="filters"> <util:map> <entry key="aName" value-ref="someFilterPojo"/> 
        </util:map> </property> -->
    <property name="filterChainDefinitions">
        <value>
            /favicon.ico = anon
            /logo.png = anon
            /shiro.css = anon
            /s/login =
            anon
            # allow WebStart to pull the jars for the swing app:
            /*.jar =
            anon
            # everything else requires authentication:
            /** = authc
        </value>
    </property>
</bean>
LoginController.java

package org.apache.shiro.samples.spring.web;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.naming.AuthenticationException;
import javax.validation.Valid;

@Controller("/login")
public class LoginController {
    @RequestMapping("/onsubmit")
    public String onSubmit(@Valid LoginCommand command, BindingResult result) {
        UsernamePasswordToken token = new UsernamePasswordToken(
                command.getUsername(), command.getPassword());
        try {
            SecurityUtils.getSubject().login(token);
        } catch (Exception e) {
            e.printStackTrace();
            return "login";
        }
        if (result.hasErrors()) {
            return "login";
        } else {
            return "success";
        }
    }
}
package org.apache.shiro.samples.spring.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.SecurityUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class LogoutController {
    @RequestMapping("/logout")
    protected String logout(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        SecurityUtils.getSubject().logout();
        return "login";
    }
}
BootstrapDataPopulator.java

package org.apache.shiro.samples.spring;

import javax.sql.DataSource;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.core.JdbcTemplate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.shiro.crypto.hash.Sha256Hash;


public class BootstrapDataPopulator implements InitializingBean {

    private static final String CREATE_TABLES = "create table users (\n"
            + "    username varchar(255) primary key,\n"
            + "    password varchar(255) not null\n" + ");\n" + "\n"
            + "create table roles (\n"
            + "    role_name varchar(255) primary key\n" + ");\n" + "\n"
            + "create table user_roles (\n"
            + "    username varchar(255) not null,\n"
            + "    role_name varchar(255) not null,\n"
            + "    constraint user_roles_uq unique ( username, role_name )\n"
            + ");\n" + "\n" + "create table roles_permissions (\n"
            + "    role_name varchar(255) not null,\n"
            + "    permission varchar(255) not null,\n"
            + "    primary key (role_name, permission)\n" + ");";

    private static final Logger log = LoggerFactory
            .getLogger(BootstrapDataPopulator.class);

    protected DataSource dataSource = null;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void afterPropertiesSet() throws Exception {
        // because we're using an in-memory hsqldb for the sample app, a new one
        // will be created each time the
        // app starts, so create the tables and insert the 2 sample users on
        // bootstrap:

        JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSource);
        jdbcTemplate.execute(CREATE_TABLES);

        // password is 'user1' SHA hashed and base64 encoded:
        // The first argument to the hash constructor is the actual value to be
        // hased. The 2nd is the
        // salt. In this simple demo scenario, the username and the password are
        // the same, but to clarify the
        // distinction, you would see this in practice:
        // new Sha256Hash( <password>, <cryptographically strong randomly
        // generated salt> (not the username!) )
        String query = "insert into users values ('user1', '"
                + new Sha256Hash("user1", "user1").toBase64() + "' )";
        jdbcTemplate.execute(query);
        log.debug("Created user1.");

        // password is 'user2' SHA hashed and base64 encoded:
        query = "insert into users values ( 'user2', '"
                + new Sha256Hash("user2", "user2").toBase64() + "' )";
        jdbcTemplate.execute(query);
        log.debug("Created user2.");

        query = "insert into roles values ( 'role1' )";
        jdbcTemplate.execute(query);
        log.debug("Created role1");

        query = "insert into roles values ( 'role2' )";
        jdbcTemplate.execute(query);
        log.debug("Created role2");

        query = "insert into roles_permissions values ( 'role1', 'permission1')";
        jdbcTemplate.execute(query);
        log.debug("Created permission 1 for role 1");

        query = "insert into roles_permissions values ( 'role1', 'permission2')";
        jdbcTemplate.execute(query);
        log.debug("Created permission 2 for role 1");

        query = "insert into roles_permissions values ( 'role2', 'permission1')";
        jdbcTemplate.execute(query);
        log.debug("Created permission 1 for role 2");

        query = "insert into user_roles values ( 'user1', 'role1' )";
        jdbcTemplate.execute(query);
        query = "insert into user_roles values ( 'user1', 'role2' )";
        jdbcTemplate.execute(query);
        log.debug("Assigned user1 roles role1 and role2");

        query = "insert into user_roles values ( 'user2', 'role2' )";
        jdbcTemplate.execute(query);
        log.debug("Assigned user2 role role2");
    }
}

请帮我纠正错误。谢谢

信息非常清楚:

Could not load JDBC driver class [oracle.jdbc.OracleDriver]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361)

您错过了类路径中的oracle驱动程序。下载它并将其添加到您的类路径。

首先,仔细检查类路径上加载的JDBCDriver

然后 BootstrapDataPopulator.java中AfterPropertieSet方法太长

package org.apache.shiro.samples.spring;

import javax.sql.DataSource;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.core.JdbcTemplate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.shiro.crypto.hash.Sha256Hash;


public class BootstrapDataPopulator implements InitializingBean {

    private static final String CREATE_TABLES = "create table users (\n"
            + "    username varchar(255) primary key,\n"
            + "    password varchar(255) not null\n" + ");\n" + "\n"
            + "create table roles (\n"
            + "    role_name varchar(255) primary key\n" + ");\n" + "\n"
            + "create table user_roles (\n"
            + "    username varchar(255) not null,\n"
            + "    role_name varchar(255) not null,\n"
            + "    constraint user_roles_uq unique ( username, role_name )\n"
            + ");\n" + "\n" + "create table roles_permissions (\n"
            + "    role_name varchar(255) not null,\n"
            + "    permission varchar(255) not null,\n"
            + "    primary key (role_name, permission)\n" + ");";

    private static final Logger log = LoggerFactory
            .getLogger(BootstrapDataPopulator.class);

    protected DataSource dataSource = null;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void afterPropertiesSet() throws Exception {
        // because we're using an in-memory hsqldb for the sample app, a new one
        // will be created each time the
        // app starts, so create the tables and insert the 2 sample users on
        // bootstrap:

        JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSource);
        jdbcTemplate.execute(CREATE_TABLES);

        // password is 'user1' SHA hashed and base64 encoded:
        // The first argument to the hash constructor is the actual value to be
        // hased. The 2nd is the
        // salt. In this simple demo scenario, the username and the password are
        // the same, but to clarify the
        // distinction, you would see this in practice:
        // new Sha256Hash( <password>, <cryptographically strong randomly
        // generated salt> (not the username!) )
        String query = "insert into users values ('user1', '"
                + new Sha256Hash("user1", "user1").toBase64() + "' )";
        jdbcTemplate.execute(query);
        log.debug("Created user1.");

        // password is 'user2' SHA hashed and base64 encoded:
        query = "insert into users values ( 'user2', '"
                + new Sha256Hash("user2", "user2").toBase64() + "' )";
        jdbcTemplate.execute(query);
        log.debug("Created user2.");

        query = "insert into roles values ( 'role1' )";
        jdbcTemplate.execute(query);
        log.debug("Created role1");

        query = "insert into roles values ( 'role2' )";
        jdbcTemplate.execute(query);
        log.debug("Created role2");

        query = "insert into roles_permissions values ( 'role1', 'permission1')";
        jdbcTemplate.execute(query);
        log.debug("Created permission 1 for role 1");

        query = "insert into roles_permissions values ( 'role1', 'permission2')";
        jdbcTemplate.execute(query);
        log.debug("Created permission 2 for role 1");

        query = "insert into roles_permissions values ( 'role2', 'permission1')";
        jdbcTemplate.execute(query);
        log.debug("Created permission 1 for role 2");

        query = "insert into user_roles values ( 'user1', 'role1' )";
        jdbcTemplate.execute(query);
        query = "insert into user_roles values ( 'user1', 'role2' )";
        jdbcTemplate.execute(query);
        log.debug("Assigned user1 roles role1 and role2");

        query = "insert into user_roles values ( 'user2', 'role2' )";
        jdbcTemplate.execute(query);
        log.debug("Assigned user2 role role2");
    }
}
您可以使用类似flyway的dbmigration

并写入spring测试


之后您可以更清楚地了解原因

您好,谢谢您的回复。我在类路径ojdbc14.jar中添加了它,但登录应用程序仍然不工作。请帮帮我。感谢you@user1175861同样的例外?是的,Jens,同样的例外我是新加入shiro安全的,我认为这是代码的问题。请你帮个忙。感谢you@user1175861不,这不是代码。您在哪里运行应用程序?您的orecle驱动程序位于哪里?
Could not load JDBC driver class [oracle.jdbc.OracleDriver]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361)
@RunWith(SpringJunit4classRunner.class)
@Contextconfiguratino
public class Test{}