springboot全局异常与事物控制

1. 全局异常处理

Spring Boot 提供了多种方式来处理全局异常,最常见的方法是使用 @ControllerAdvice 和 @ExceptionHandler 注解。这种方法不仅可以捕获控制器层的异常,还可以跨多个控制器提供统一的错误响应格式。

实现步骤:
  • 创建一个全局异常处理器类 :使用 @ControllerAdvice 注解定义一个全局异常处理器类。

  • 定义异常处理方法 :使用 @ExceptionHandler 注解为特定类型的异常定义处理逻辑,并返回适当的 HTTP 响应。

代码示例

java 复制代码
@ControllerAdvice
public class GlobalExceptionHandler {

    // 处理自定义异常
    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<?> resourceNotFoundException(ResourceNotFoundException ex, WebRequest request) {
        ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), request.getDescription(false));
        return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
    }

    // 处理所有其他异常
    @ExceptionHandler(Exception.class)
    public ResponseEntity<?> globalExceptionHandler(Exception ex, WebRequest request) {
        ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), request.getDescription(false));
        return new ResponseEntity<>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
自定义异常类(可选):

为了更好地组织异常信息,你可以创建自己的异常类,如 ResourceNotFoundException。

java 复制代码
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

class ErrorDetails {
    private Date timestamp;
    private String message;
    private String details;

    public ErrorDetails(Date timestamp, String message, String details) {
        this.timestamp = timestamp;
        this.message = message;
        this.details = details;
    }

    // Getters and Setters
}

2. 事务控制

Spring Boot 使用声明式事务管理来简化事务处理。通过 @Transactional 注解可以轻松地将方法或整个类标记为需要事务支持。此外,Spring Boot 还提供了编程式事务管理的方式,但声明式方式更为常用且推荐。

实现步骤:
  • 添加依赖:确保你的项目包含了 JPA 或 MyBatis 等持久化框架的相关 Starter 依赖,这些通常会自动配置事务管理器。

  • 使用 @Transactional 注解 :在需要事务管理的方法上添加 @Transactional 注解。你也可以在服务类级别应用该注解,以确保该类中的所有公共方法都参与事务。

代码示例

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    // 单个方法级别的事务控制
    @Transactional
    public User createUser(User user) {
        return userRepository.save(user);
    }

    // 类级别的事务控制
    @Service
    @Transactional
    public class OrderService {

        @Autowired
        private OrderRepository orderRepository;

        public void placeOrder(Order order) {
            // 所有此方法内的数据库操作都会包含在一个事务中
            orderRepository.save(order);
            // ... 更多业务逻辑 ...
        }
    }
}
事务属性配置(可选):

@Transactional 注解允许你指定更多细粒度的事务属性,如传播行为、隔离级别、只读标志等。

java 复制代码
@Transactional(readOnly = true)
public List<User> getAllUsers() {
    return userRepository.findAll();
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateUserData(User user) {
    userRepository.save(user);
}

总结

通过上述方法,可以有效地实现 Spring Boot 应用程序的全局异常处理和事务控制。全局异常处理提高了应用程序的健壮性,而正确的事务管理则保证了数据的一致性和完整性。结合这两种技术,可以使应用程序更加可靠和易于维护。

相关推荐
小码哥_常几秒前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
学长毕设3 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw4 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号5 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
努力的小雨5 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
论文复现现场5 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠6 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David6 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
excel6 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放6 小时前
Python基础语法练习题(73)
java·前端·python