我来分步骤讲解Java基于Spring注解AOP的异常处理的方法:
步骤一:创建异常处理器
首先需要创建一个异常处理器,用于捕获和处理程序中可能会遇到的异常。
package com.example.demo.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(Exception e) {
ModelAndView mav = new ModelAndView();
mav.addObject("error", e.getMessage());
mav.setViewName("error");
return mav;
}
}
以上是一个通用的全局异常处理器,当程序中发生任何未知的异常时,都会由这个处理器来处理。
步骤二:开启AOP配置
接下来需要开启AOP配置,以便切入到需要处理异常的方法。
在spring的配置文件中,增加以下配置:
<aop:aspectj-autoproxy/>
这将会开启AOP的自动代理功能,Spring会自动把使用@Aspect注解的类声明为切面,并进行代理。
步骤三:创建切入点和切面
在需要进行异常处理的方法上,使用@Pointcut和@Around注解来创建切入点和切面。
package com.example.demo.service;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ServiceAspect {
@Pointcut("execution(public * com.example.demo.service.*.*(..))")
public void serviceLog() {}
@Around("serviceLog()")
public Object handleException(ProceedingJoinPoint pjp) throws Throwable {
Object result;
try {
result = pjp.proceed();
} catch (Exception e) {
throw new RuntimeException(e);
}
return result;
}
}
这是一个Service层的切面,用于切入到Service层中的所有方法。在Around注解中,使用try-catch来处理可能会抛出的异常,并将其封装成RuntimeException再次抛出。
需要注意的是,这里只是示例,实际情况下,需要根据实际业务需要进行精细的处理。
示例一:处理自定义异常
package com.example.demo.service.impl;
import com.example.demo.exception.FileUploadException;
import com.example.demo.service.FileService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@Service
public class FileServiceImpl implements FileService {
@Override
public String upload(MultipartFile file) {
if (file.isEmpty()) {
throw new FileUploadException("文件不能为空");
}
String fileName = UUID.randomUUID().toString() + "-" + StringUtils.cleanPath(file.getOriginalFilename());
File destFile = new File("upload/" + fileName);
try {
file.transferTo(destFile);
} catch (IOException e) {
throw new FileUploadException("文件上传失败", e);
}
return fileName;
}
}
这是一个上传文件的Service方法,如果文件为空则抛出自定义的FileUploadException异常。由于我们已经在切面中处理了异常,因此不需要在方法中捕获和处理异常。抛出异常的工作交给切面处理即可。
示例二:处理数据访问异常
package com.example.demo.service.impl;
import com.example.demo.entity.User;
import com.example.demo.exception.DataAccessException;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findByUsername(String username) {
User user = userMapper.findByUsername(username);
if (user == null) {
throw new DataAccessException("用户不存在");
}
return user;
}
}
这是一个根据用户名查询用户的Service方法,如果用户不存在则抛出DataAccessException异常。同样的,由于我们已经在切面中处理了异常,因此不需要在方法中捕获和处理异常。抛出异常的工作交给切面处理即可。
以上就是Java基于Spring注解AOP的异常处理的方法的完整攻略,希望能够对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java基于spring注解AOP的异常处理的方法 - Python技术站