今天遇到一个问题,并不是技术上很牛逼,只是有一点灵异,如何灵异的呢?因为我第一次部署测试没有反应,但是当我实在是hold不住,调试spring mvc源码的时候,它悄悄的,竟然好了。。。。。由此而产生的最直接后果是,当第一次我测试失败后,我直接否定了这个方案转而尝试其他方案,结果导致了我浪费了很多时间。。。。。
个中蛋疼问题,心力憔悴之处暂且不表,言归正传。
应用场景:
Spring MVC中拦截器拦截项目中的Exception,这很正常,不正常的是,要求在拦截这个异常的时候记录下发生异常的方法名,参数,在Spring MVC的拦截器中我们实现了HandlerExceptionResolver,重写的方法为public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {}
在这里我只拿到Exception的信息,而无法直接得知出错的方法名和出错时的参数。
因为Spring MVC的容器和Spring Core的容器不是同一个,这个问题的关键,我无法直接获取我想要的信息,好吧,为了我那可怜的工资,我辈只能奋不顾身。
PS :因为一些信息的原因,有些敏感字符也删除,各位勿喷。
首先:定义一个AOP,先写一个简单的Class,
public class ExceptionAdvisor{
public void afterThrowing(JoinPoint joinPoint, Exception ex) {
Method method = ((MethodSignature)joinPoint.getSignature()).getMethod();
Object[] args = joinPoint.getArgs();
String methodName = method.getName();
StringBuilder builder = new StringBuilder(512);
builder.append("\nMethod Name is :").append(methodName).append("\n");
if (args != null) {
int size = args.length;
builder.append("Method Args:\n");
for (int index = 0; index < size; index ++) {
Object object = args[index];
builder.append("args[").append(index).append("]:").append(object.toString()).append("\n");
}
}
builder.append(ex.getMessage());
throw new RuntimeException(builder.toString());
}
}
注意上述的做法是,先把我需要的信息拼装起来,然后重新throw一个RuntimeException
同样的,上配置文件:
<bean id="exceptionadvice" class="com.playsnail.platform.exception.handler.ExceptionAdvisor" />
<aop:config proxy-target-class="true">
<aop:aspect ref="exceptionadvice" >
<aop:after-throwing method="afterThrowing" pointcut="execution (* 路径..*.*(..))" throwing="ex"/>
</aop:aspect>
</aop:config>
这样便拦截到了Spring core里面的异常。
当我们throw新的RuntimeException后,就需要Spring MVC的拦截器闪亮登场。
public class ExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
//此处的Exception就是AOP重新抛出的Exception了,现在对重新抛出的异常做你想做的事情
return new ModelAndView();
}
同样的,不能少了配置文件,在spring MVC的配置文件中增加
<bean id="exceptionResolver" class="路径.ExceptionHandler "></bean>
OK, 简单吧,但是摸索的过程是痛苦的,特别有一些灵异事件以后。
上面是milestone版,后期可能会出现一些变动,还需要实践的证明,各位看官有什么指正之处或者有什么更好的办法,欢迎各位狂喷。
相关推荐
下面将详细解释Spring MVC拦截器的工作原理、配置和实际应用。 1. **工作原理**: - 拦截器是基于AOP(面向切面编程)思想实现的,它通过预处理器和后处理器模式,对HTTP请求进行拦截。 - 当一个请求到达Spring ...
5. 在 SpringMVC 的配置文件中注册拦截器,通常是在 `<mvc:interceptors>` 标签内使用 `<bean>` 标签定义拦截器,并在 `<mvc:mapping>` 中指定拦截的路径。 例如,一个简单的权限验证拦截器可能如下所示: ```java...
总结来说,Spring Boot中的拦截器是实现业务逻辑增强的关键工具,通过实现HandlerInterceptor接口并注册到Spring MVC配置中,我们可以灵活地控制请求的生命周期,从而提高应用的功能性和灵活性。在设计和实现拦截器...
以下是关于Spring MVC拦截器实现的详细分析: 1. **拦截器接口与方法**: Spring MVC的拦截器接口是`HandlerInterceptor`,它提供了三个关键方法: - `preHandle(HttpServletRequest request, ...
- `afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)`:在整个请求处理完成后调用,无论是否有异常抛出。可以用来释放资源或者进行日志记录。 4. **...
除了自定义的拦截器,Spring MVC还提供了一个默认的异常处理器,它会捕获Controller方法抛出的异常,并根据异常类型进行相应处理。开发者可以扩展这个类来定制错误页面或者返回JSON格式的错误信息。 5. **Spring ...
下面将详细阐述Spring MVC拦截器的工作原理、使用场景以及如何创建和配置。 1. **拦截器的工作原理** 拦截器是基于AOP(面向切面编程)的概念,它在控制器处理请求之前和之后执行一系列预定义的方法。在Spring MVC...
- **拦截器**属于Spring MVC的组成部分,运行在Servlet容器的上下文中,依赖于Spring的AOP代理。 - **过滤器**遵循Servlet规范,适用于所有类型的Web应用,独立于Spring框架。 总结,SpringBoot的拦截器提供了灵活...
本文将深入探讨Spring MVC拦截器的使用。 ### 一、拦截器概念 拦截器是基于AOP(面向切面编程)思想实现的,它可以理解为一个过滤器,拦截用户请求并进行预处理。Spring MVC提供了一个`HandlerInterceptor`接口,...
`@ControllerAdvice`是Spring MVC提供的一个注解,用于定义一个全局的异常处理器,它可以捕获并处理所有`@RequestMapping`注解的方法抛出的异常。下面是一个简单的`@ControllerAdvice`示例: ```java import org....
43、指出在springaop中concern和cross-cuttingconcern的不同之处。 在Spring AOP中,concern指的是应用程序中的业务逻辑代码,而cross-cutting concern是横切关注点,如日志记录、事务管理等,这些关注点贯穿多个...
`throw`和`throws`关键字用于抛出异常和声明异常,其中`throw`用于在方法内部抛出一个异常实例,而`throws`则用于在方法签名中声明可能抛出的异常类型。 ### 3. Java反射机制 Java反射允许程序在运行时获取类的信息...
2. **@ControllerAdvice**: 这个注解是Spring MVC的一个特性,用于标记一个类为控制器的全局顾问,它会拦截所有带有@RequestMapping、@GetMapping、@PostMapping等注解的方法抛出的异常。在类中定义一个异常处理方法...
这类异常没法要求程序员去一一捕获并抛出,一般异常是Java类库或程序员自己写的代码发生的错误,这类异常可以由我们去一一捕获并抛出。 多线程几种实现方法,同步? 答:多线程有两种实现方法,一种是继承Thread类...
9. **Exception Handler(异常处理器)**:Struts2提供了一种优雅的异常处理机制,可以全局处理Action执行过程中抛出的异常,并指定相应的结果。 10. **Struts2与Spring集成**:Struts2可以方便地与Spring框架集成...
- **finally**:在try-catch块中,无论是否抛出异常,finally块内的代码总会被执行。 - **finalize**:对象被垃圾回收前,Java会尝试调用此方法进行资源清理,但不保证一定会执行。 以上就是对"java_Javaweb_SSH...
9. **Exception Handling**:Struts提供了全局的异常处理机制,可以捕获和处理Action执行过程中抛出的异常,提供统一的错误页面。 10. **Internationalization国际化**:Struts支持多语言环境,通过资源包...
- Struts框架提供全局的Exception Handler,可以统一处理应用中抛出的异常,并导航到错误页面。 10. **Struts与Spring集成** - 可以通过Spring-Struts整合,利用Spring的依赖注入(DI)和面向切面编程(AOP)特性...
- `exception`模块中的`HrException.java`定义了系统中可能抛出的自定义异常。 - `schedule`模块包含`PayJob.java`和`PunchJob.java`,实现了薪酬计算和打卡处理的调度任务。 - `magicgis.hrsystem.web`包含了...
- **exception**: 如果JSP页面定义为错误处理页,则此对象包含抛出的异常信息。 #### 2、Servlets的生命周期? Servlet的生命周期包括以下几个阶段: - **加载和实例化**:当服务器启动时,或首次请求Servlet时,...