企业权限管理系统的时候,用SSM Aop日志一直报Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException
下面是异常
HTTP Status 500 - Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException
type Exception report
message Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException
description The server encountered an internal error that prevented it from fulfilling this request.
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:986)
root cause
java.lang.reflect.UndeclaredThrowableException
com.itcast.controller.ProductController$$EnhancerBySpringCGLIB$$f90ca1fd.findAll(<generated>)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
root cause
java.lang.NoSuchMethodException: com.itcast.controller.ProductController.findAll(java.lang.Integer, java.lang.Integer)
java.lang.Class.getMethod(Class.java:1786)
com.itcast.controller.LogAop.doBefore(LogAop.java:51)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.47 logs.
@Component
@Aspect
public class LogAop {
@Autowired
private HttpServletRequest request;
@Autowired
private ISyslogService sysLogService;
private Date visitTime; //开始时间
private Class clazz; //访问的类
private Method method;//访问的方法
//前置通知 主要是获取开始时间,执行的类是哪一个,执行的是哪一个方法
@Before("execution(* com.itcast.controller.*.*(..))")
public void doBefore(JoinPoint jp) throws NoSuchMethodException {
visitTime = new Date();//当前时间就是开始访问的时间
clazz = jp.getTarget().getClass(); //具体要访问的类
String methodName = jp.getSignature().getName(); //获取访问的方法的名称
Object[] args = jp.getArgs();//获取访问的方法的参数
//获取具体执行的方法的Method对象
if (args == null || args.length == 0) {
method = clazz.getDeclaredMethod(methodName); //只能获取无参数的方法
} else {
Class[] classArgs = new Class[args.length];
for (int i = 0; i < args.length; i++) {
classArgs[i] = args[i].getClass();
}
clazz.getDeclaredMethod(methodName, classArgs);
}
}
//后置通知
@After("execution(* com.itcast.controller.*.*(..))")
public void doAfter(JoinPoint jp) throws Exception {
long time = new Date().getTime() - visitTime.getTime(); //获取访问的时长
String url = "";
//获取url
if (clazz != null && method != null && clazz != LogAop.class) {
//1.获取类上的@RequestMapping("/orders")
RequestMapping classAnnotation = (RequestMapping) clazz.getAnnotation(RequestMapping.class);
if (classAnnotation != null) {
String[] classValue = classAnnotation.value();
//2.获取方法上的@RequestMapping(xxx)
RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class);
if (methodAnnotation != null) {
String[] methodValue = methodAnnotation.value();
url = classValue[0] + methodValue[0];
//获取访问的ip
String ip = request.getRemoteAddr();
//获取当前操作的用户
SecurityContext context = SecurityContextHolder.getContext();//从上下文中获了当前登录的用户
User user = (User) context.getAuthentication().getPrincipal();
String username = user.getUsername();
//将日志相关信息封装到SysLog对象
Syslog sysLog = new Syslog();
sysLog.setExecutionTime(time); //执行时长
sysLog.setIp(ip);
sysLog.setMethod("[类名] " + clazz.getName() + "[方法名] " + method.getName());
sysLog.setUrl(url);
sysLog.setUsername(username);
sysLog.setVisitTime(visitTime);
//调用Service完成操作
sysLogService.save(sysLog);
}
}
}
}
}
**想要获取的方法的代码如下:**
```java
@RequestMapping("/findAll")
@RolesAllowed("ADMIN")
public ModelAndView findAll(@RequestParam(name = "page",required = true,defaultValue = "1")int page,@RequestParam(name = "size",required = true,defaultValue = "4")int size){
ModelAndView mv = new ModelAndView();
List<Product> products = productService.findAll(page,size);
PageInfo pageInfo = new PageInfo(products);
mv.addObject("pageInfo",pageInfo);
mv.setViewName("product-list11");
return mv;
}
之前一直以为自己的代码写错了,检查了好几遍,还是报这个错,通过debug发现在获取方法的名称的时候有问题,经过测试发现把方法的参数去掉没有错,或者方法的参数类型为Integer类型的也没有问题