[org.springframework.context.support.GenericApplicationContext] - Refreshing org.springframework.context.support.GenericApplicationContext@6982bec3: startup date [Wed Jun 28 13:39:18 CST 2017]; root of context hierarchy
[org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
[org.springframework.test.context.TestContextManager] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@6ff1ac71] to prepare test instance [com.yunwei.mybatis.TestMybatis@63706821]
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.yunwei.mybatis.TestMybatis': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.yunwei.user.service.IUserService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(shareable=true, mappedName=, description=, name=, type=class java.lang.Object, lookup=, authenticationType=CONTAINER)}
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:307)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:384)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:110)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:319)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:212)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.yunwei.user.service.IUserService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(shareable=true, mappedName=, description=, name=, type=class java.lang.Object, lookup=, authenticationType=CONTAINER)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1100)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:441)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:419)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:544)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:155)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:304)
... 26 more
[org.springframework.context.support.GenericApplicationContext] - Closing org.springframework.context.support.GenericApplicationContext@6982bec3: startup date [Wed Jun 28 13:39:18 CST 2017]; root of context hierarchy
package com.yunwei.user.service.impl;
import java.util.List;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.yunwei.shiro.ShiroKit;
import com.yunwei.user.dao.IRoleDao;
import com.yunwei.user.dao.IUserDao;
import com.yunwei.user.pojo.Role;
import com.yunwei.user.pojo.User;
import com.yunwei.user.pojo.Resource;
import com.yunwei.user.service.IUserService;
@Service
public class UserServiceImpl implements IUserService {
private static final Logger logger = LoggerFactory
.getLogger(UserServiceImpl.class);
@Autowired
private IUserDao userDao;
@Autowired
private IRoleDao roleDao;
/**
* 返回新插入用户数据的主键
*
* @param user
* @return
*/
@Override
public Integer add(User user) {
// 使用用户名作为盐值,MD5 算法加密
user.setPassword(ShiroKit.md5(user.getPassword(), user.getUsername()));
userDao.add(user);
Integer userID = user.getId();
return userID;
}
/**
* 为单个用户设置多个角色
*
* @param user
* @param rids
*/
@Override
public void add(User user, List<Integer> rids) {
Integer userId = this.add(user);
roleDao.addUserRoles(userId, rids);
}
/**
* 根据 user_id 删除用户数据
*
* @param id
*/
@Override
public void delete(int id) {
userDao.delete(id);
}
/**
* 更新用户数据 1、更新用户基本信息 2、更新用户所属角色 (1)先删除所有的角色 (2)再添加绑定的角色
*
* @param user
* @param rids
*/
@Override
public void update(User user, List<Integer> rids) {
Integer userId = user.getId();
roleDao.deleteUserRoles(userId);
roleDao.addUserRoles(userId, rids);
this.update(user);
}
/**
* 更新单个用户信息
*
* @param user
* @return
*/
@Override
public Integer update(User user) {
String password = user.getPassword();
if (password != null) {
user.setPassword(ShiroKit.md5(user.getPassword(),
user.getUsername()));
}
return userDao.update(user);
}
/**
* 根据主键 id 加载用户对象
*
* @param id
* @return
*/
@Override
public User load(int id) {
return userDao.load(id);
}
/**
* 根据用户名加载用户对象(用于登录使用)
*
* @param username
* @return
*/
@Override
public User loadByUsername(String username) {
return userDao.loadByUserName(username);
}
/**
* 登录逻辑 1、先根据用户名查询用户对象 2、如果有用户对象,则继续匹配密码 如果没有用户对象,则抛出异常
*
* @param username
* @param password
* @return
*/
@SuppressWarnings("unused")
@Override
public User login(String username, String password) {
User user = userDao.loadByUserName(username);
if (user == null) {
// 抛出对象不存在异常
logger.debug("用户名不存在");
throw new UnknownAccountException("用户名和密码不匹配");
} else if (false) {
// !user.getPassword().equals(password)
logger.debug("密码错误");
// 抛出密码不匹配异常
throw new IncorrectCredentialsException("用户名和密码不匹配");
} else if (user.getStatus() == 0) {
throw new LockedAccountException("用户已经被锁定,请联系管理员启动");
}
return user;
}
/**
* 查询所有的用户对象列表
*
* @return
*/
@Override
public List<User> list() {
return userDao.listUser();
}
/**
* 根据角色 id 查询是这个角色的所有用户
*
* @param id
* @return
*/
@Override
public List<User> listByRole(int id) {
return userDao.listByRole(id);
}
/**
* 查询指定用户所指定的角色字符串列表
*
* @param uid
* @return
*/
@Override
public List<Resource> listAllResource(int uid) {
return userDao.listAllResources(uid);
}
/**
* 查询指定用户所绑定的角色列表
*
* @param uid
* @return
*/
@Override
public List<String> listRoleSnByUser(int uid) {
return userDao.listRoleSnByUser(uid);
}
/**
* 查询指定用户所绑定的角色列表
*
* @param uid
* @return
*/
@Override
public List<Role> listUserRole(int uid) {
return userDao.listUserRole(uid);
}
}
package com.yunwei.user.service;
import java.util.List;
import com.yunwei.user.pojo.Resource;
import com.yunwei.user.pojo.Role;
import com.yunwei.user.pojo.User;
public interface IUserService {
/**
* 添加单个用户
*
* @param user
*/
public Integer add(User user);
/**
* 批量添加用户角色关联表数据
*
* @param user
* @param rids
*/
public void add(User user, List<Integer> rids);
/**
* 根据 user_id 删除用户数据
*
* @param id
*/
public void delete(int id);
/**
* (2)再添加绑定的角色
*
* @param user
* @param rids
*/
public void update(User user, List<Integer> rids);
/**
* 更新单个用户信息
*
* @param user
* @return
*/
public Integer update(User user);
/**
* 根据主键 id 加载用户对象
*
* @param id
* @return
*/
public User load(int id);
/**
* 根据用户名加载用户对象(用于登录使用)
*
* @param username
* @return
*/
public User loadByUsername(String username);
/**
* 登录逻辑 1、先根据用户名查询用户对象 2、如果有用户对象,则继续匹配密码 如果没有用户对象,则抛出异常
*
* @param username
* @param password
* @return
*/
public User login(String username, String password);
/**
* 查询所有的用户对象列表
*
* @return
*/
public List<User> list();
/**
* 根据角色 id 查询是这个角色的所有用户
*
* @param id
* @return
*/
public List<User> listByRole(int id);
/**
* 查询指定用户 id 所拥有的权限
*
* @param uid
* @return
*/
public List<Resource> listAllResource(int uid);
/**
* 查询指定用户所指定的角色字符串列表
*
* @param uid
* @return
*/
public List<String> listRoleSnByUser(int uid);
/**
* 查询指定用户所绑定的角色列表
*
* @param uid
* @return
*/
public List<Role> listUserRole(int uid);
}
package com.yunwei.user.dao;
import java.util.List;
import org.springframework.stereotype.Component;
import com.yunwei.user.pojo.Resource;
import com.yunwei.user.pojo.Role;
import com.yunwei.user.pojo.User;
@Component("UserMapper")
public interface IUserDao {
public Integer add(User user);
public Integer update(User user);
public Integer delete(Integer id);
public User load(Integer id);
public List<User> listUser();
public User loadByUserName(String username);
/**
* 根据角色 id 查询所有是该角色的用户列表
*
* @param rid
* @return
*/
public List<User> listByRole(Integer rid);
public List<Resource> listAllResources(Integer uid);
public List<String> listRoleSnByUser(Integer uid);
public List<Role> listUserRole(Integer uid);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
id, username, password, nickname,status
SELECT
id,
username,
password,
nickname,
status
FROM
t_user
WHERE
id = #{id}
SELECT
id,
username,
password,
nickname,
status
FROM
t_user
parameterType="java.lang.String">
SELECT
id,
username,
password,
nickname,
status
FROM
t_user
WHERE
username = #{username}
SELECT
tu.id,
tu.username,
tu.password,
tu.nickname,
tu.status
FROM
t_user tu
LEFT JOIN t_user_role tur ON tu.id = tur.user_id
LEFT JOIN t_role tr ON
tur.role_id = tr.id
WHERE tr.id =#{rid}
<!-- 根据用户 id 查询这个用户拥有的所有资源(这里的资源就代表权限) -->
parameterType="java.lang.Integer">
SELECT tr.id,tr.name,tr.permission,tr.url
FROM t_resource
tr
LEFT JOIN t_role_resource trr ON tr.id = trr.resource_id
LEFT JOIN
t_user_role tur ON trr.role_id = tur.role_id
WHERE tur.user_id = #{uid}
<!-- 根据用户 id 查询用户所具有的角色字符串表示 -->
parameterType="java.lang.Integer">
SELECT
tr.sn
FROM t_role tr
LEFT JOIN t_user_role tur ON tr.id = tur.role_id
LEFT JOIN t_user tu ON tur.user_id = tu.id
WHERE tu.id = #{uid}
<!-- 根据用户 id 查询用户所具有的角色对象表示 -->
SELECT
tr.id,
tr.name,
tr.sn
FROM t_role tr
LEFT JOIN t_user_role tur ON tr.id = tur.role_id
LEFT JOIN t_user tu ON tur.user_id = tu.id
WHERE tu.id = #{uid}
DELETE FROM t_user
where id =
#{id}
insert into t_user
(username,password,nickname,status)
values
(#{username},#{password},#{nickname},#{status})
UPDATE t_user
username = #{username},
password = #{password},
nickname = #{nickname},
status = #{status}
WHERE
id = #{id}
<?xml version="1.0" encoding="UTF-8"?>
xmlns:util="http://www.springframework.org/schema/util" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 自动扫描 -->
<!-- 引入配置文件 -->
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- 这里支持多种寻址方式:classpath和file -->
classpath:jdbc.properties
<!-- 推荐使用file的方式引入,这样可以将配置和代码分离 -->
classpath:dust.properties
<!-- jdbc参数配置 -->
destroy-method="close">
<!-- 初始化连接大小 -->
<!-- 连接池最大数量 -->
<!-- 连接池最大空闲 -->
<!-- 连接池最小空闲 -->
<!-- 获取连接最大等待时间 -->
<!--重试发送数据类 参数配置 -->
<!-- 数据发送类参数配置 -->
init-method="initMethod">
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<!-- 自动扫描mapping.xml文件 -->
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
package com.yunwei.mybatis;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.yunwei.user.pojo.User;
import com.yunwei.user.service.IUserService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:*/spring-mybatis.xml"})
public class TestMybatis {
private static Logger logger = Logger.getLogger(TestMybatis.class);
@Resource
private IUserService userService;
@Test
public void test1() throws Exception {
User user = new User();
user.setUsername("zhouguang");
user.setPassword("666666");
user.setNickname("周光1");
user.setStatus(1);
userService.add(user);
logger.debug("返回自增长的主键:" + user.getId());
}
}