🦖
Wii
  • 原码补码反码
  • Archive
    • Job
      • Learn
      • 算法
      • Company
        • HundunDaxue
      • Company
      • 基础
        • 原码补码反码
      • 项目经验
      • require
    • Hobbies
      • Physics
        • 上帝粒子
        • 概述
        • 时间
      • Movie
        • MovieList
      • Psychology
        • Psychology
        • Chenli
          • ChenliLivingRoom
      • Philosophy
        • Philosophy
        • Conceptions
        • 导言
      • Travel
        • City
          • 昆明
          • 沈阳
        • articles-check-list
      • Sports
        • Swimming
        • Skiing
      • Earth
        • Ocean
          • Biology
      • Read
        • BookList
        • 道德经
        • BookToRead
      • Music
        • sort
      • PickUp
        • SoldiersSortie
    • Care
      • Illness
        • cold
        • 腹泻
        • acne
        • EmotionalControl
        • 咽炎
        • Anemia
      • Foods
        • 破壁机
          • 食谱
      • I
      • WishList
      • WithL
        • MF
          • LY
    • Wfw
      • QA
    • Mac
      • Brew
        • 软件安装目录
      • Usage
        • RunScriptAsRootOnBoot
        • Mac-Config
      • 制作启动U盘
      • Software
        • IntelliJIDEALicenseServer
          • run-license-server
    • PlantUML
      • plantuml
    • Windows
      • Windows常用命令
      • PowerShell
        • powershell 命令
      • Cmder
      • MTP服务驱动无法安装
    • English
      • 英语阅读2016-07-29
      • 英语阅读2016-08-11
    • Tools
      • Plantuml
        • Setup
      • Eclipse
        • Eclipse
        • Eclipse常见问题
      • CommonHotkey
      • Jetbrain
        • JetbrainIDEs
      • VSCode
      • SublimeText
        • 格式化代码
    • I
      • WHATIAM
    • Device
      • Netgear
        • Astrill
      • RPi
        • Hardware
    • AwesomeSoftware
    • RESTful
    • Course
      • 自然辩证法
        • 我国在生态文明建设中存在的困境及解决对策
        • 工程师应该具有的基本道德素养
        • 科学文化与人文文化的关系
      • 英语写作
        • Description
      • 分布式系统
        • 分布式系统概论
      • 英语口语
        • 辩论赛
    • CloudLib
      • 推荐0.1
    • Project
      • README
        • emq
          • Emq架构
        • 启动
        • Hikvision
          • TimeSetting
    • Efficient
    • Neu
      • IpCamera
        • live
        • ffmpeg
    • Matlab
      • Matlab 2016b 破解
    • SchoolWork
      • 学术道德与学术规范
    • git-push
  • Coding
    • Design Pattern
      • 设计模式笔记_四_工厂模式
      • 设计模式笔记_六_命令模式
      • 设计模式笔记_三_装饰者模式
      • 设计模式入门
      • 设计模式笔记_八_模板方法模式
      • 设计模式笔记_一_策略模式
      • 设计模式笔记_五_单件模式
      • 设计模式笔记_七_适配器模式与外观模式
      • 设计模式笔记_二_观察者模式
      • 设计模式笔记_十_状态模式
      • 设计模式笔记_九_迭代器与组合模式
    • C++
      • Notes
        • Practice
          • Logger
        • Thread
          • PosixThreadPrograming
          • ThreadNote
        • Features
          • FuturePromise
          • Lambda
        • STL
          • STLPractice
          • 迭代器
          • UnorderedMapSet
          • Containor
          • STL
          • Vector
        • CMake
          • Startup
          • CMakeExample
          • CMake
          • CMakeUsage
          • CMakeKnowledge
        • Mutex
        • Gdb
          • Gdb
        • LanguageNotes
          • Pointer
          • String
          • Functions
          • 友元
          • IO
          • OOP
          • Exceptions
          • Basic
          • 初始化
          • Random
          • 模板函数
        • Glog
          • glog
        • Thrift
          • Thrift
        • Valgrind
          • valgrind
        • 动态库 & 静态库
        • BookNotes
          • AboutC++
        • LRvalues
      • map
      • protobuf
      • Build
      • Seastar
        • Notes
          • std::move
          • Introduce
          • Install
            • BuildAndInstall
          • Steps
          • cmd
      • Tricks
      • Map
      • CommonOperation
      • FreqAlgorithm
    • Tools
      • Git
        • GitExamples
        • GitUsage
        • GitKnowledge
        • GitIgnoreExample
        • DeleteBigFileFromHistory
      • Vim
        • VimTips
        • 安装
        • Vim-Usage
        • Plugins
        • Vim-Config
      • SVN
        • svn服务器搭建
        • svn
    • Scala
      • Notes
        • Scala-模式匹配
        • Scala: 隐式
        • Scala-符号语法
        • Scala-函数
        • Scala面向对象编程
        • Scala 函数式编程
        • Scala:zipWithIndex
        • Future
        • Scala-语法
        • Scala-基础
      • DateTime
      • 规范
    • Python
      • Notes
        • BookNotes
          • 生成器
          • 垃圾回收机制
          • 数据结构
          • 数据类型
          • RegularExpression
          • 迭代器
          • NetworkProgramming
          • 函数式编程
          • 上下文管理器
          • PythonDataModel
          • 运算符
          • 魔术方法
          • 面向对象
          • 装饰器
          • 模块
          • MultithreadProgramming
          • 异常
          • 函数
        • Modules
          • stack
          • Datetime
          • shutil:文件操作
          • logging
          • urllib
          • Re
          • 容器数据类型
          • TypeError
          • str
          • queue
          • urllib-and-requests
          • Exception
          • path
          • os
        • Others
          • PythonSerialization
          • Python函数的docstring
          • PIL
          • type-cast
          • operations
          • Python-类
          • 组及命名组匹配
          • Package
          • jieba分词
          • logging模块
          • Python
          • print
        • Examples
          • 文件读取写入
          • 命名
          • 递归更改文件为windows合法名称
          • 定制命令行运行方式
          • Python处理Excel文件(xlsx文件格式)
          • 读取ini配置文件
          • tor代理
          • 添加父目录到Path
        • CommonTips
        • CodingStandards
          • python注释
          • PEP-8
      • Django
        • DjangoDocs
          • making queries
          • 设置media路径
          • models
          • manage.py使用
          • template
          • view
          • forms
          • setting.py 文件配置说明
          • nginx-deploy
          • 使用pymysql
          • 自定义tags和filters
          • admin-interface
        • DjangoRestFramework
          • Customer Permissions
          • Serializers
          • FileField绝对路径问题
          • DjangoRestFrameworkNotes
          • ViewSet
        • DjangoNotes
          • Model对象转化为Dict
          • QuerySet
      • Scrapy
        • Scrapy
        • Spider
        • Scrapy安装出错
        • Selector
        • Scrapy模拟登陆
      • Job
        • 字典
      • Pandas
        • pandas
        • PandasExamples
      • VirtualEnv
        • virtualenv
      • Numpy
        • NumpyUsage
        • numpy
      • Matplotlib
        • MatplotlibNotes
        • MatplotlibUsage
      • Database
        • 获取表字段
      • Pip
        • 更改源
      • Scipy
        • scipy
    • Web
      • 插件
        • bootstrap-table
          • bootstrap-table
        • bootstrap
          • 模态框
        • requirejs
          • requirejs
        • toastr
          • toastor
      • Koa
        • Notes
          • KoaNotes
      • SCSS
        • 常用标签
        • Watch
      • Vue
        • Notes
          • 路由
          • 参考
          • 组件
          • Plugins
          • Vuex
          • StartUp
      • 样式
      • CSS
        • CSS
      • 排版
      • Notes
        • 跨域访问
      • Hexo
        • HexoUsage
      • Nodejs
        • Koa
          • jest
          • ParamValidate
        • 仓库镜像
      • Express
        • Express
        • Jade
          • Jade
      • Canvas
        • Canvas
    • Basic
      • Data Structure
        • Heap
          • Heap
        • Tree
          • Tree
        • Benchmark
          • map
      • Boolean
      • MultithreadProgramming
      • Software Engineering
        • UML
          • UML
      • OOP
      • 介绍
    • Antlr
      • Example
      • Grammar
      • Antlr
    • Java
      • Library
        • MyBatis
          • generator
            • mybatis配置详解
          • mybatis-获取自增ID
          • mybatis
          • problems
        • log4j
          • Usage
      • Maven
        • MavenUsage
        • Maven
        • MavenProject
        • 项目RUL路径问题
        • MavenPom
        • Settings
        • PomCommon
        • PomExample
      • Notes
        • Features
          • Reflect
          • Java函数式编程
          • toMap
          • Closeable & AutoCloseable & Flushable
          • Annotations
        • Common
        • ThinkingInJava
          • 控制执行流程
          • 接口
          • 复用类
          • 内部类
          • 操作符
          • 访问权限控制
          • 一切都是对象
          • 多态
          • 初始化与清理
          • 对象导论
        • SwordToOffer
        • Network
        • Thread
          • ThreadPool
        • Basic Library
        • Collections
          • List Interface
        • CommandLine
        • Project Common
        • JavaLang
      • JVM
        • Monitor
          • Jmap
          • mat
          • Jstat
          • Monitor
        • Notes
          • JVM
        • GC
          • GC
          • Shenandoah
            • Shenandoah
        • JVM
    • Algorithm
      • Code
        • LeetCode
          • Python
            • 0000-0050
              • 0005
              • 0030
        • SwordToOffer
          • SwordToOffer
      • AlgorithmSummary
      • Classics
        • string
          • KMP
        • Other
          • FullPermutation
        • 链表
        • Sort
          • Sort
      • Other
        • README
      • Notes
        • Math
          • 两点计算直线方程
    • Go
      • Notes
        • Go Project Layout
        • Install
        • Startup
      • Basic
        • Startup
        • Types
    • JavaScript
      • MasonryLayouts
      • jquery
      • Notes
        • Promise
      • js
    • Android
      • SDK
        • 打开SDK Manager
    • C#
      • WebBrowser
      • c#图片
      • 跨线程访问控件
    • Knowledge
      • 函数式编程
      • 设计框架
    • Rules
      • Rules
    • React
      • ReactNative
        • React Native Navigation
        • 打包Apk
        • ReactNative
      • React
        • README
    • RegExp
      • 正则表达式
    • WeChatApp
      • 登陆
    • Node
      • Notes
        • StartUp
  • Computer Science
    • ICS Security
      • 工控网络
      • 工业控制系统
      • HoneyPot
        • 蜜罐软件
          • Honeyd
      • 工业以太网
      • CNVD
        • 环境及依赖
      • 现有蜜罐系统及工具
      • 工控系统安全措施
      • 蜜网
      • 蜜罐
      • 工控安全相关概念
    • Data Analysis
      • Data Mining
        • Notes
          • Data_Preprocessing
          • 数据预处理
          • 认识数据
          • Mining_Modeling
          • 数据探索
          • Python_Data_Mining_Functions
          • Python数据分析平台搭建
          • Reference_Books
          • 数据分析与挖掘基础
        • Jupyter
          • show
            • mean
      • Hadoop
        • Hadoop权威指南:数据完整性
        • Hadoop权威指南: I/O操作序 - 列化
        • Hadoop权威指南-从Hadoop URL读取数据
        • Hadoop权威指南:FSDataInputStream对象
        • HDFS常用命令
        • Hadoop权威指南:HDFS-数据流
        • Hadoop权威指南:通过distcp并行复制
        • Hadoop权威指南:压缩
        • Hadoop权威指南:HDFS-Hadoop存档
        • 解决使用Idea/Eclipse编写Hadoop程序包依赖问题
        • HDFS
        • Hadoop-命令
        • 简单javaHadoop应用程序从打包到提交运行
        • Hadoop权威指南:HDFS-写入数据
        • Hadoop权威指南:HDFS-目录,查询文件系统,删除文件
        • HadoopInputFormat-OutputFormart
        • Hadoop-HDFS命令行接口
        • Hadoop权威指南-MapReduce应用开发
        • Linux下使用javac编译Hadoop程序
        • Hadoop权威指南:通过FileSystem API读取数据
        • Hadoop专有数据类型
      • Spark
        • Spark计算模型
        • Spark-入门二
        • 安装Hadoop及Spark(Ubuntu 16.04)
        • Spark:核心概念简介
        • Spark:控制日志输入
        • Spark - RDD编程
        • Spark工作机制
        • Spark-一个独立应用
        • Spark
        • Spark:使用Spark Shell的两个示例
    • Linux
      • Notes
        • BuildInCommand
          • ls
          • ip
          • ftp
          • 目录栈操作
          • scp
          • expect
            • expect示例
            • expect手册
            • expect笔记
          • ps
          • vsftpd
          • wget
          • 压缩程序
            • zip_unzip
            • tar
            • p7zip
          • 部署web服务
          • avidemux
          • cat
          • Awk
          • find
          • pssh使用
          • grep
          • sed
          • 路径
          • 通用命令
          • 安装JDK
          • 进程管理
          • network
          • rsync
          • cron
          • 示例
          • 用户管理
          • supervisor
        • Common
        • TestFileProcess
          • 替换文件内容
        • Commonds
        • Permissions
      • Ubuntu
        • Ubuntu 服务器配置部署
        • Ubuntu笔记
        • Ubuntu网络配置
        • Ubuntu 16.04 几个国内源
      • Script
        • ShellProgramming
        • ShellExamples
        • ShellCommands
      • CentOS
        • Centos笔记
        • 源
        • CentOS-Network-Config
        • CentOS-Security
      • Squid
        • BuildByDocker
        • Squid
      • Problem
        • 常见错误
      • Linux
        • Linux-c-cpp
        • Linux
        • Linux-NetworkProgramming
      • Codes
        • cron-test-01
      • Software
        • Shortcut key
        • Anaconda
      • Make
        • tricks
      • Deepin
        • 安装docker
      • SRE
        • CommonCommand
    • Cloud Computing
      • OpenStack
        • Fuel离线安装OpenStack
        • 验证网络
        • OpenStackNotes
    • Network
      • TCP/IP
      • 套接字
      • OSI模型
    • Data mining
      • StartUp
    • Machine Learning
      • Notes
        • 决策树学习-周志华
        • 神经网络-周志华
        • 概念学习和一般到特殊序
        • MachineLearningProblems
        • Math
          • 概率论与数理统计
          • 数学概念
          • KKT条件
          • 最优化问题
          • 优化算法
          • 最小二乘
        • 模型评估与选择
        • 引言
        • 过拟合处理
        • StatisticalLearningMethod
          • 统计学习方法概论
          • 感知机
        • 评估假设
        • Code
          • FeatureEngineering
            • Iris
        • 概念
        • SVM
        • FeatureEngineering
        • 神经网络
        • 决策树学习
        • MachineLearningKnowledge
        • 线性模型
        • 术语概念
        • 拉格朗日乘子法
      • route
      • Jupyter
        • JupyterUsage
      • Anaconda
        • AnacondaUsage
      • Coursera
        • Week01
      • ScikitLearn
        • FitTransform
        • Preprocessing
      • Octave
        • Octave
    • Search
      • Lucene
        • Api
        • Concepts
    • Virtualization Tech
      • Docker
        • dockerNetwork
        • Ubuntu
        • DockerUsage
        • Mac OS
    • Database
      • MySQL
        • Mysql Cluster
        • mysql-cluster
        • mysql
      • 部署phpmyadmin
      • SQL
      • SQL
        • SQLStatement
    • Concepts
      • Other
      • Mohout
      • LDA
    • Distributed System
      • Concepts
        • TODO
        • TODO
    • Recommend System
      • DataPipline
        • DataBus
        • 系统
    • OS
      • OS-Code
      • Notes
        • Introduce
        • ProcessManagement
        • Kernel
    • Deep Learning
      • Code
        • README
      • Notes
        • Conceptions
        • 神经网络
        • LeNet5
        • CNN
      • Tensorflow
        • Notes
          • Tensorflow
          • tensorflow开始
        • Anaconda
    • Media
      • FFmpeg
        • LiveStream
          • run
    • Spider
      • Selenium
        • Selenium
    • IoT
      • emq
        • Authentication
    • Big Data
      • Hadoop
        • MR 作业
  • Architecture
    • Storage
      • Mongodb
        • Mongodb
        • Failed to unlink socket file
      • Pegasus
        • Pegasus
        • ShellTools
      • Rocksdb
        • RocksJava
        • RocksDB
        • 本地缓存
      • Redis
        • Install
        • RedisUsage
      • 基本要素
      • HBase
        • HBase
    • MQ
      • Kafka
        • VersionCompare
        • Deploy
        • cppkafka
        • CommandLineTools
        • OffsetManage
        • Attentions
        • Notes
        • QA
    • Framework
      • Java
        • Dubbo
          • Annotation
          • 简介
        • Spring
          • SpringTest
          • 常见错误
          • TransactionRollback
          • FileUpload
          • SpringMVCNote
          • IoC
          • Start
          • Notes
            • Config
          • Spring
          • springmvc
          • Modules
        • Rose
          • Get request body
        • Netty
          • Netty
        • SpringBoot
          • SpringBoot
      • Esper
        • Documents
          • Keyed Segmented Context
          • 01 - Getting Started
          • 02 - Event Representations
          • 03 - Processing Modal
      • Swagger
        • Swagger
    • RPC
      • Thrift
        • Notes
          • Set fields
          • ThriftTyps
        • BuildFromSource
        • ThriftUsage
        • Install
      • ProtocolBuffer
        • 减少内存拷贝
        • UsageExample
        • Arena
        • ProtocolBuffer
    • Distribution
      • CAP
    • Streaming
      • Spark
        • Init
      • MapReduce
      • Spark
    • Nginx
      • Nginx knowledge
      • nginx-configurtion
      • 403
      • nginx解析php文件时502
    • Governance
      • Consul
      • Zookeeper
        • Zookeeper
      • MicroServiceArchitecture
      • 依赖
    • Conceptions
      • CloudNative
    • Kibana
      • Query
    • Performance Optimizaition
      • Notes
        • Conceptions
        • CPUAffinity
  • Math
    • Probability Theory
      • 一些概率分布
    • Statistics
      • 统计量与估计量
    • Other
      • 排列组合
  • Tools
    • Markdown
      • syntax
    • Jetbrains
      • Jetbrains
    • Zsh
      • Install
  • TODO
由 GitBook 提供支持
在本页
  • 配置
  • 示例代码
  • 相关
  • 全部
  • 测试代码
  • 相关
  • 全部
  • 效果
  • 问题
  • 捕获异常不抛出就不会回滚
  • 参考

这有帮助吗?

  1. Architecture
  2. Framework
  3. Java
  4. Spring

TransactionRollback

title: 事务回滚 tags:

  • 事务回滚

  • SpringMVC

    categories:

  • JavaEE

配置

相关

    <!-- 事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 传播行为 -->
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
        </tx:attributes>
    </tx:advice>

    <!-- transaction support-->
    <!-- enable transaction annotation support -->
    <tx:annotation-driven transaction-manager="transactionManager" />

全部

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/aop http://www.springframework.org/schema/aop/spring-aop-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">

    <!-- 数据库连接池 -->
    <!-- 加载配置文件 -->
    <context:property-placeholder location="classpath:resource/*.properties" />
    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        destroy-method="close">
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="maxActive" value="10" />
        <property name="minIdle" value="5" />
    </bean>
    <!-- 配置sqlsessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property>
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 配置扫描包,加载mapper代理对象 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.neu.cse.powercloud.mapper"></property>
    </bean>
    <!-- 扫描包加载Service实现类 -->
    <context:component-scan base-package="com.neu.cse.powercloud.serviceImpl"></context:component-scan>
    <!-- 事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 传播行为 -->
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
        </tx:attributes>
    </tx:advice>

    <!-- transaction support-->
    <!-- enable transaction annotation support -->
    <tx:annotation-driven transaction-manager="transactionManager" />

    <!-- 切面 -->
    <aop:config>
        <aop:advisor advice-ref="txAdvice"
            pointcut="execution(* com.neu.cse.powercloud.service.*.*(..))" />
    </aop:config>
</beans>

示例代码

相关

    /**
     * 添加系统用户
     * @param user                SysUser实例
     * @param roles               角色列表
     * @param dataAuthorities   用户数据权限列表
     * @return ResponseResult
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public ResponseResult addUser(SysUser user, List<Integer> roles, List<Integer> dataAuthorities) throws Exception {
        try {
            SysUserExample example = new SysUserExample();
            SysUserExample.Criteria criteria = example.createCriteria();
            criteria.andUsernameEqualTo(user.getUsername());
            if (sysUserMapper.selectByExample(example).isEmpty()) {     // 判断用户名是否已存在
                try {
                    user.setPassword(MD5Encoder.encoderStringByMD5(user.getPassword()));    // 对密码加密
                    sysUserMapper.insert(user);     // 向数据库插入新用户信息
                    // 设置角色
                    // TODO
                    // 设置数据权限
                    // TODO
                } catch (Exception e) {
                    e.printStackTrace();
                    logger.error(e);
                    return ResponseResult.no("用户信息不正确");
                }
                // TODO 删除事务回滚测试抛出异常
                throw new Exception("事务回滚测试");
                // return ResponseResult.ok();
            } else {
                return ResponseResult.no("用户已存在");
            }
        } catch (Exception e) {
            logger.error(e);
            if (e.toString().contains("事务")) {
                throw new Exception("事务回滚测试");
            }
            return ResponseResult.no("未知异常!");
        }
    }

全部

package com.neu.cse.powercloud.serviceImpl.sysmanage;

import com.github.pagehelper.PageHelper;
import com.neu.cse.powercloud.mapper.sysmanage.SysUserMapper;
import com.neu.cse.powercloud.pojo.sysmanage.SysUser;
import com.neu.cse.powercloud.pojo.sysmanage.SysUserExample;
import com.neu.cse.powercloud.service.sysmanage.UserManageService;
import com.neu.cse.powercloud.serviceImpl.PropertiesServiceImpl;
import com.neu.cse.powercloud.util.MD5Encoder;
import com.neu.cse.powercloud.util.ResponseResult;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 用户管理服务实现
 * @author szk
 */
@Service
public class UserManageServiceImpl implements UserManageService {

    private Logger logger = Logger.getLogger(UserManageServiceImpl.class);

    @Autowired(required = true)
    private SysUserMapper sysUserMapper;

    @Autowired
    private PropertiesServiceImpl propertiesServiceImpl;

    /**
     * 添加系统用户
     * @param name                用户名
     * @param password           原始(未经md5加密)密码
     * @param customerId         客户id
     * @param tel                 电话
     * @param status              状态
     * @param roles               角色列表
     * @param dataAuthorities   用户数据权限列表
     * @return  ResponseResult
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public ResponseResult addUser(String name, String password, int customerId, String tel, String status,
                                  List<Integer> roles, List<Integer> dataAuthorities) throws Exception {
        SysUser user = new SysUser();
        user.setPassword(password);
        user.setCustomerid(customerId);
        user.setStatus(status);
        user.setTel(tel);
        user.setUsername(name);
        return this.addUser(user, roles, dataAuthorities);
    }

    /**
     * 添加系统用户
     * @param user                SysUser实例
     * @param roles               角色列表
     * @param dataAuthorities   用户数据权限列表
     * @return ResponseResult
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public ResponseResult addUser(SysUser user, List<Integer> roles, List<Integer> dataAuthorities) throws Exception {
        try {
            SysUserExample example = new SysUserExample();
            SysUserExample.Criteria criteria = example.createCriteria();
            criteria.andUsernameEqualTo(user.getUsername());
            if (sysUserMapper.selectByExample(example).isEmpty()) {     // 判断用户名是否已存在
                try {
                    user.setPassword(MD5Encoder.encoderStringByMD5(user.getPassword()));    // 对密码加密
                    sysUserMapper.insert(user);     // 向数据库插入新用户信息
                    // 设置角色
                    // TODO
                    // 设置数据权限
                    // TODO
                } catch (Exception e) {
                    e.printStackTrace();
                    logger.error(e);
                    return ResponseResult.no("用户信息不正确");
                }
                // TODO 删除事务回滚测试抛出异常
                throw new Exception("事务回滚测试");
                // return ResponseResult.ok();
            } else {
                return ResponseResult.no("用户已存在");
            }
        } catch (Exception e) {
            logger.error(e);
            if (e.toString().contains("事务")) {
                throw new Exception("事务回滚测试");
            }
            return ResponseResult.no("未知异常!");
        }
    }

    /**
     * 获取用户列表
     * 获取区间: [start, min(start+length, total))
     * @param start     开始索引,从0开始
     * @param length    获取长度
     * @return           ResponseResult
     */
    @Override
    public ResponseResult getUsers(int start, int length) {
        try {
            SysUserExample example = new SysUserExample();
            int page = start / length + 1;  // Page 从1开始

            PageHelper.startPage(page, length);     // 设置PageHelper;此处开始分页,获取记录必须放在该语句之后
            List<SysUser> users = sysUserMapper.selectByExample(example);   // 已经被分页

            return ResponseResult.ok(users);
        } catch (Exception e) {
            logger.error(e);
            e.printStackTrace();
            return ResponseResult.no("未知异常!");
        }
    }

    /**
     * 删除指定id用户
     *
     * @param userId 用户id
     * @return 操作结果
     */
    @Override
    public ResponseResult deleteUser(int userId) {
        try {
            sysUserMapper.deleteByPrimaryKey(userId);
            return ResponseResult.ok();
        } catch (Exception e) {
            logger.error(e);
            return ResponseResult.no("未知异常!");
        }
    }
}

测试代码

相关

    @Test
    public void addUser2() throws Exception {
        // 测试事务回滚
        SysUser user = new SysUser();
        user.setUsername("name" + new Random().nextInt());
        user.setTel("1213123");
        user.setStatus("事务回滚测试");
        user.setCustomerid(10010);
        user.setPassword("passwordPass");

        // 角色
        List<Integer> roles = new ArrayList<Integer>();
        roles.add(1);
        // TODO
        ResponseResult result = userManageService.addUser(user, roles, null);
    }

全部

package com.neu.cse.powercloud.serviceImpl.sysmanage;

import com.github.pagehelper.Page;
import com.neu.cse.powercloud.pojo.sysmanage.SysUser;
import com.neu.cse.powercloud.service.sysmanage.UserManageService;
import com.neu.cse.powercloud.util.ResponseResult;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

/**
 * 系统用户管理测试类
 * @author szk
 */
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration(value = "src/main/webapp")
@ContextConfiguration(locations = { "classpath:spring/springmvc.xml", "classpath:mybatis/SqlMapConfig.xml", "classpath:spring/applicationContext.xml"})
public class UserManageServiceImplTest {

    @Autowired
    private UserManageService userManageService;

    @Autowired
    private WebApplicationContext wac;
    private MockMvc mockMvc;
    private MockHttpSession session;

    @Before
    public void setUp() {
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
        session = new MockHttpSession();
    }


    @Test
    public void addUser() throws Exception {
        // 需要登录
        // 发送请求
        String sysUserJson = "{ \"username\": \"admin" + new Random().nextInt() + "\", \"password\": \"admin1\", \"passwordrepeat\": \"admin1\", " +
                "\"customerid\": \"100010\", \"tel\": \"191717171\", \"status\": \"1\"}";
        System.out.println(sysUserJson);

        MvcResult result = this.mockMvc.perform(
                post("/user/add")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(sysUserJson)
                        .session((MockHttpSession)getLoginSession()))
                .andDo(print())
                .andExpect(status().isOk())
//                .andExpect(jsonPath("$.msg").value("OK"))
                .andReturn();
        String content = result.getResponse().getContentAsString();
        System.out.println(content);
        // System.out.println(userManageService.getUsers(0, 10));
    }

    @Test
    public void addUser1() throws Exception {
        ResponseResult result = userManageService.addUser("name"+new Random().nextInt(), "password", 10010, "18283892", "1", null, null);
        Assert.assertEquals(result.isOk(), true);
    }

    @Test
    public void addUser2() throws Exception {
        // 测试事务回滚
        SysUser user = new SysUser();
        user.setUsername("name" + new Random().nextInt());
        user.setTel("1213123");
        user.setStatus("事务回滚测试");
        user.setCustomerid(10010);
        user.setPassword("passwordPass");

        // 角色
        List<Integer> roles = new ArrayList<Integer>();
        roles.add(1);
        // TODO
        ResponseResult result = userManageService.addUser(user, roles, null);
    }

    @Test
    public void getUsers() throws Exception {
        ResponseResult result = userManageService.getUsers(0, 3);
        Page page = (Page)result.getData();
        System.out.println(page.getTotal());
        System.out.println(page.getResult());
        System.out.println(page.size());    // 该页记录数量

        for (int i=0; i < page.size(); ++i) {
            SysUser tUser = (SysUser) page.get(i);
            System.out.println(tUser);
        }
    }

    @Test
    public void deleteUser() throws Exception {
        ResponseResult result = userManageService.getUsers(0, 3);
        System.out.println(result.getData());
        Assert.assertTrue(result.getData() instanceof Page);
        Page page = (Page)result.getData();
        System.out.println(page);
        long totalBefore = page.getTotal();
        if (page.size() > 0) {
            SysUser deleteUser = (SysUser) page.get(0);
            System.out.println("删除用户:" + deleteUser);
            userManageService.deleteUser(deleteUser.getId());

            result = userManageService.getUsers(0, 3);
            page = (Page)result.getData();
            if (page.size() > 0) {
                Assert.assertNotEquals(((SysUser) page.get(0)).getId(), deleteUser.getId());
            }
            Assert.assertEquals(totalBefore, page.getTotal() + 1);
        }
    }

    /**
     * 获取登录session
     * @return  Session
     * @throws Exception E
     */
    private HttpSession getLoginSession() throws Exception {
        MvcResult result = this.mockMvc.perform(
                post("/login/userLogin")
                        .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                        .param("account", "admin")
                        .param("password", "admin"))
                .andExpect(status().isOk())
                .andDo(print())
                .andReturn();

        return result.getRequest().getSession();
    }
}

效果

  • 未插入用户

  • 测试日志如下

/usr/lib/jvm/jdk/bin/java -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:/home/public/installed/idea/lib/idea_rt.jar=41509:/home/public/installed/idea/bin -Dfile.encoding=UTF-8 -classpath /home/public/installed/idea/lib/idea_rt.jar:/home/public/installed/idea/plugins/junit/lib/junit-rt.jar:/usr/lib/jvm/jdk/jre/lib/charsets.jar:/usr/lib/jvm/jdk/jre/lib/deploy.jar:/usr/lib/jvm/jdk/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/jdk/jre/lib/ext/dnsns.jar:/usr/lib/jvm/jdk/jre/lib/ext/jaccess.jar:/usr/lib/jvm/jdk/jre/lib/ext/jfxrt.jar:/usr/lib/jvm/jdk/jre/lib/ext/localedata.jar:/usr/lib/jvm/jdk/jre/lib/ext/nashorn.jar:/usr/lib/jvm/jdk/jre/lib/ext/sunec.jar:/usr/lib/jvm/jdk/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/jdk/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/jdk/jre/lib/ext/zipfs.jar:/usr/lib/jvm/jdk/jre/lib/javaws.jar:/usr/lib/jvm/jdk/jre/lib/jce.jar:/usr/lib/jvm/jdk/jre/lib/jfr.jar:/usr/lib/jvm/jdk/jre/lib/jfxswt.jar:/usr/lib/jvm/jdk/jre/lib/jsse.jar:/usr/lib/jvm/jdk/jre/lib/management-agent.jar:/usr/lib/jvm/jdk/jre/lib/plugin.jar:/usr/lib/jvm/jdk/jre/lib/resources.jar:/usr/lib/jvm/jdk/jre/lib/rt.jar:/home/public/workspace/Idea/PowerCloud/target/test-classes:/home/public/workspace/Idea/PowerCloud/target/classes:/home/public/data/maven/repo/joda-time/joda-time/2.5/joda-time-2.5.jar:/home/public/data/maven/repo/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2.jar:/home/public/data/maven/repo/commons-io/commons-io/1.3.2/commons-io-1.3.2.jar:/home/public/data/maven/repo/commons-net/commons-net/3.3/commons-net-3.3.jar:/home/public/data/maven/repo/com/fasterxml/jackson/core/jackson-databind/2.4.2/jackson-databind-2.4.2.jar:/home/public/data/maven/repo/com/fasterxml/jackson/core/jackson-annotations/2.4.0/jackson-annotations-2.4.0.jar:/home/public/data/maven/repo/com/fasterxml/jackson/core/jackson-core/2.4.2/jackson-core-2.4.2.jar:/home/public/data/maven/repo/org/apache/httpcomponents/httpclient/4.3.5/httpclient-4.3.5.jar:/home/public/data/maven/repo/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar:/home/public/data/maven/repo/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar:/home/public/data/maven/repo/commons-codec/commons-codec/1.6/commons-codec-1.6.jar:/home/public/data/maven/repo/junit/junit/4.12/junit-4.12.jar:/home/public/data/maven/repo/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:/home/public/data/maven/repo/org/mockito/mockito-core/2.10.0/mockito-core-2.10.0.jar:/home/public/data/maven/repo/net/bytebuddy/byte-buddy/1.7.4/byte-buddy-1.7.4.jar:/home/public/data/maven/repo/net/bytebuddy/byte-buddy-agent/1.7.4/byte-buddy-agent-1.7.4.jar:/home/public/data/maven/repo/org/objenesis/objenesis/2.6/objenesis-2.6.jar:/home/public/data/maven/repo/com/jayway/jsonpath/json-path/2.4.0/json-path-2.4.0.jar:/home/public/data/maven/repo/net/minidev/json-smart/2.3/json-smart-2.3.jar:/home/public/data/maven/repo/net/minidev/accessors-smart/1.2/accessors-smart-1.2.jar:/home/public/data/maven/repo/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar:/home/public/data/maven/repo/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:/home/public/data/maven/repo/org/slf4j/slf4j-log4j12/1.6.4/slf4j-log4j12-1.6.4.jar:/home/public/data/maven/repo/log4j/log4j/1.2.16/log4j-1.2.16.jar:/home/public/data/maven/repo/org/mybatis/mybatis/3.2.8/mybatis-3.2.8.jar:/home/public/data/maven/repo/org/mybatis/mybatis-spring/1.2.2/mybatis-spring-1.2.2.jar:/home/public/data/maven/repo/com/github/miemiedev/mybatis-paginator/1.2.15/mybatis-paginator-1.2.15.jar:/home/public/data/maven/repo/com/github/pagehelper/pagehelper/3.4.2/pagehelper-3.4.2.jar:/home/public/data/maven/repo/mysql/mysql-connector-java/5.1.32/mysql-connector-java-5.1.32.jar:/home/public/data/maven/repo/com/alibaba/druid/1.0.9/druid-1.0.9.jar:/usr/lib/jvm/jdk/lib/jconsole.jar:/usr/lib/jvm/jdk/lib/tools.jar:/home/public/data/maven/repo/org/springframework/spring-context/4.1.3.RELEASE/spring-context-4.1.3.RELEASE.jar:/home/public/data/maven/repo/org/springframework/spring-aop/4.1.3.RELEASE/spring-aop-4.1.3.RELEASE.jar:/home/public/data/maven/repo/aopalliance/aopalliance/1.0/aopalliance-1.0.jar:/home/public/data/maven/repo/org/springframework/spring-core/4.1.3.RELEASE/spring-core-4.1.3.RELEASE.jar:/home/public/data/maven/repo/org/springframework/spring-expression/4.1.3.RELEASE/spring-expression-4.1.3.RELEASE.jar:/home/public/data/maven/repo/org/springframework/spring-beans/4.1.3.RELEASE/spring-beans-4.1.3.RELEASE.jar:/home/public/data/maven/repo/org/springframework/spring-webmvc/4.1.3.RELEASE/spring-webmvc-4.1.3.RELEASE.jar:/home/public/data/maven/repo/org/springframework/spring-web/4.1.3.RELEASE/spring-web-4.1.3.RELEASE.jar:/home/public/data/maven/repo/org/springframework/spring-jdbc/4.1.3.RELEASE/spring-jdbc-4.1.3.RELEASE.jar:/home/public/data/maven/repo/org/springframework/spring-tx/4.1.3.RELEASE/spring-tx-4.1.3.RELEASE.jar:/home/public/data/maven/repo/org/springframework/spring-aspects/4.1.3.RELEASE/spring-aspects-4.1.3.RELEASE.jar:/home/public/data/maven/repo/org/aspectj/aspectjweaver/1.8.4/aspectjweaver-1.8.4.jar:/home/public/data/maven/repo/org/springframework/spring-test/4.1.3.RELEASE/spring-test-4.1.3.RELEASE.jar:/home/public/data/maven/repo/jstl/jstl/1.2/jstl-1.2.jar:/home/public/data/maven/repo/javax/servlet/javax.servlet-api/3.0.1/javax.servlet-api-3.0.1.jar:/home/public/data/maven/repo/javax/servlet/jsp-api/2.0/jsp-api-2.0.jar:/home/public/data/maven/repo/javax/servlet/servlet-api/2.4/servlet-api-2.4.jar:/home/public/data/maven/repo/commons-fileupload/commons-fileupload/1.3.1/commons-fileupload-1.3.1.jar com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 com.neu.cse.powercloud.serviceImpl.sysmanage.UserManageServiceImplTest,addUser2
2017-10-16 10:11:47,027 [main] [com.neu.cse.powercloud.serviceImpl.sysmanage.UserManageServiceImpl]-[ERROR] java.lang.Exception: 事务回滚测试

java.lang.Exception: 事务回滚测试

    at com.neu.cse.powercloud.serviceImpl.sysmanage.UserManageServiceImpl.addUser(UserManageServiceImpl.java:93)
    at com.neu.cse.powercloud.serviceImpl.sysmanage.UserManageServiceImplTest.addUser2(UserManageServiceImplTest.java:97)
    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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:73)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:217)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)


Process finished with exit code 255

问题

捕获异常不抛出就不会回滚

解决方法

  • 例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理

    if(userSave){         
         try {          
            userDao.save(user);          
            userCapabilityQuotaDao.save(capabilityQuota);         
           } catch (Exception e) {         
            logger.info("能力开通接口,开户异常,异常信息:"+e);          
            throw new RuntimeException();         
         }          
    }

    ​

  • 在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常

    if(userSave){          
        try {          
            userDao.save(user);          
            userCapabilityQuotaDao.save(capabilityQuota);          
        } catch (Exception e) {          
            logger.info("能力开通接口,开户异常,异常信息:"+e);          
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();         
        }         
     }

修改后代码

package com.neu.cse.powercloud.serviceImpl.sysmanage;

import com.github.pagehelper.PageHelper;
import com.neu.cse.powercloud.mapper.sysmanage.SysUserMapper;
import com.neu.cse.powercloud.pojo.sysmanage.SysUser;
import com.neu.cse.powercloud.pojo.sysmanage.SysUserExample;
import com.neu.cse.powercloud.service.sysmanage.UserManageService;
import com.neu.cse.powercloud.serviceImpl.PropertiesServiceImpl;
import com.neu.cse.powercloud.util.Exception.ServiceRuntimeException;
import com.neu.cse.powercloud.util.MD5Encoder;
import com.neu.cse.powercloud.util.ResponseResult;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.util.List;

/**
 * 用户管理服务实现
 * @author szk
 */
@Service
public class UserManageServiceImpl implements UserManageService {

    private Logger logger = Logger.getLogger(UserManageServiceImpl.class);

    @Autowired(required = true)
    private SysUserMapper sysUserMapper;

    @Autowired
    private PropertiesServiceImpl propertiesServiceImpl;

    /**
     * 添加系统用户
     * @param name                用户名
     * @param password           原始(未经md5加密)密码
     * @param customerId         客户id
     * @param tel                 电话
     * @param status              状态
     * @param roles               角色列表
     * @param dataAuthorities   用户数据权限列表
     * @return  ResponseResult
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public ResponseResult addUser(String name, String password, int customerId, String tel, String status,
                                  List<Integer> roles, List<Integer> dataAuthorities) {
        SysUser user = new SysUser();
        user.setPassword(password);
        user.setCustomerid(customerId);
        user.setStatus(status);
        user.setTel(tel);
        user.setUsername(name);
        return this.addUser(user, roles, dataAuthorities);
    }

    /**
     * 添加系统用户
     * @param user                SysUser实例
     * @param roles               角色列表
     * @param dataAuthorities   用户数据权限列表
     * @return ResponseResult
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public ResponseResult addUser(SysUser user, List<Integer> roles, List<Integer> dataAuthorities) {
        try {
            SysUserExample example = new SysUserExample();
            SysUserExample.Criteria criteria = example.createCriteria();
            criteria.andUsernameEqualTo(user.getUsername());
            if (sysUserMapper.selectByExample(example).isEmpty()) {     // 判断用户名是否已存在
                try {
                    user.setPassword(MD5Encoder.encoderStringByMD5(user.getPassword()));    // 对密码加密
                    sysUserMapper.insert(user);     // 向数据库插入新用户信息
                } catch (Exception e) {
                    throw new ServiceRuntimeException("用户信息错误");
                }

                // 设置角色
                // TODO
                // 设置数据权限
                // TODO

                throw new ServiceRuntimeException("回滚测试");

                // return ResponseResult.ok();
            } else {
                throw new ServiceRuntimeException("用户已存在");
            }
        } catch (ServiceRuntimeException e) {   // 处理自定义异常
            logger.error(e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();  // 如果修改数据修改失败,回滚事务
            return ResponseResult.no(e.getMessage());   // 返回业务提示信息
        } catch (Exception e) {     // 处理未知异常
            logger.error(e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();  // 如果修改数据修改失败,回滚事务
            return ResponseResult.no("未知异常");
        }
    }

    /**
     * 获取用户列表
     * 获取区间: [start, min(start+length, total))
     * @param start     开始索引,从0开始
     * @param length    获取长度
     * @return           ResponseResult
     */
    @Override
    public ResponseResult getUsers(int start, int length) {
        try {
            SysUserExample example = new SysUserExample();
            int page = start / length + 1;  // Page 从1开始

            PageHelper.startPage(page, length);     // 设置PageHelper;此处开始分页,获取记录必须放在该语句之后
            List<SysUser> users = sysUserMapper.selectByExample(example);   // 已经被分页

            return ResponseResult.ok(users);
        } catch (Exception e) {
            logger.error(e);
            e.printStackTrace();
            return ResponseResult.no("未知异常!");
        }
    }

    /**
     * 删除指定id用户
     *
     * @param userId 用户id
     * @return 操作结果
     */
    @Override
    public ResponseResult deleteUser(int userId) {
        try {
            sysUserMapper.deleteByPrimaryKey(userId);
            return ResponseResult.ok();
        } catch (Exception e) {
            logger.error(e);
            return ResponseResult.no("未知异常!");
        }
    }
}

参考

上一页常见错误下一页FileUpload

最后更新于4年前

这有帮助吗?

参考一
参考二