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 应用程序的全局异常处理和事务控制。全局异常处理提高了应用程序的健壮性,而正确的事务管理则保证了数据的一致性和完整性。结合这两种技术,可以使应用程序更加可靠和易于维护。