SpringAOP前置通知处理异常包装类BindingResult

    利用Spring前置通知,捕捉controller方法调用之前的BindingResult类型参数,将参数校验异常提前抛出去。省去对controller内对BindingResult作检查,避免了代码污染。
@Aspect
@Configuration
public class ParamVeriyAspect {

	@Before(value = PointCut.CONTRLLER_POINTCUT)
	public void getVerifyException(JoinPoint joinPoint) {
		Object[] args = joinPoint.getArgs();
		if (null == args || args.length == 0) {
			return;
		}
		for (Object object : args) {
			if (object instanceof BindingResult) {
				BindingResult br = (BindingResult) object;
				if (br.hasErrors()) {
					throw new ParamException(buildMessage(br));
				}
			}
		}
	}

	private String buildMessage(BindingResult bindingResult) {
		List<FieldError> fieldErrors = bindingResult.getFieldErrors();
		List<String> messages=DrinListUtils.list2list(fieldErrors,error->fieldError.getDefaultMessage());
		
		return join(messages,",");
	}
}

示例:

@RequestMapping("/list")
public JsonResult findAreas(@Validated AreaQueryPo po, BindingResult br) throws Exception {
	//无须再对BindingResult进行处理
	return service.findAreas(po);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SpringAOP 全称为 Spring Aspect-Oriented Programming,是 Spring 框架中的一个模块,用于实现面向切面编程。在 SpringAOP 中,我们可以通过定义切点和通知来实现对目标对象的增强。 在平台开发中,我们可以使用 SpringAOP 来解决平台统一异常处理的问题。具体实现步骤如下: 1. 定义异常处理切面 在 SpringAOP 中,我们可以使用 @Aspect 注解来定义切面。在切面类中,我们需要定义一个处理异常的方法,并使用 @AfterThrowing 注解来指定这个方法是用于处理异常的。例如: ```java @Aspect public class ExceptionHandlerAspect { @AfterThrowing(pointcut = "execution(* com.example.*.*(..))", throwing = "ex") public void handleException(Exception ex) { // 处理异常的逻辑 } } ``` 在上述代码中,我们定义了一个名为 ExceptionHandlerAspect 的切面类,并在其中定义了一个名为 handleException 的方法,该方法的参数为 Exception 类型,用于处理异常。我们使用 @AfterThrowing 注解来指定这个方法是用于处理异常的,pointcut 属性用于指定切入点,这里我们使用 execution 表达式来匹配 com.example 包及其子包下的所有方法。 2. 配 SpringAOP 在 Spring 配文件中,我们需要配 SpringAOP。具体来说,我们需要定义一个名为 exceptionHandlerAspect 的 bean,并在其中指定切面的实现类。例如: ```xml <bean id="exceptionHandlerAspect" class="com.example.ExceptionHandlerAspect"/> <aop:config> <aop:aspect ref="exceptionHandlerAspect"> <aop:after-throwing method="handleException" throwing="ex"/> </aop:aspect> </aop:config> ``` 在上述代码中,我们首先定义了一个名为 exceptionHandlerAspect 的 bean,该 bean 的 class 属性指定了切面的实现类。然后,在 aop:config 标签中,我们使用 aop:aspect 标签来定义切面,并在其中指定切面的实现类。在 aop:aspect 标签中,我们使用 aop:after-throwing 标签来指定切面所织入的方法,method 属性用于指定处理异常的方法名,throwing 属性用于指定方法抛出的异常类型。 3. 使用统一异常处理 在业务代码中,当发生异常时,SpringAOP 会自动调用我们定义的异常处理方法。在这个方法中,我们可以根据具体的业务需求来处理异常。例如: ```java @Service public class UserServiceImpl implements UserService { @Override public void addUser(User user) { // 业务逻辑 try { // 执行业务操作 } catch (Exception e) { throw new RuntimeException("添加用户失败!"); } } } ``` 在上述代码中,当执行 addUser 方法时,如果发生异常SpringAOP 会自动调用我们定义的异常处理方法 handleException,并将异常对象作为参数传入该方法中。在 handleException 方法中,我们可以根据具体的业务需求来处理异常,例如记录日志、发送邮件等。 通过使用 SpringAOP,我们可以实现平台统一异常处理,避免代码中出现大量的 try-catch 代码块,提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值