Search in sources :

Example 1 with RedirectorInterrupt

use of org.axe.exception.RedirectorInterrupt in project Axe by DongyuCai.

the class ReflectionUtil method invokeMethod.

/**
     * 调用方法
     */
public static Object invokeMethod(Object obj, Method method, Object... args) {
    Object result;
    method.setAccessible(true);
    try {
        MethodHandle mh = MethodHandles.lookup().unreflect(method);
        ArrayList<Object> argList = new ArrayList<>();
        argList.add(obj);
        if (args != null) {
            for (Object arg : args) {
                argList.add(arg);
            }
        }
        result = mh.invokeWithArguments(argList);
    } catch (Throwable cause) {
        LOGGER.error("invoke method failure,method : " + method + ", args : " + args, cause);
        if (cause instanceof RestException) {
            //Rest中断异常,需要返回前台异常信息
            throw (RestException) cause;
        } else if (cause instanceof RedirectorInterrupt) {
            //重定向中断,需要跳转
            throw (RedirectorInterrupt) cause;
        } else {
            throw new RuntimeException(cause);
        }
    }
    /*try {
			result = method.invoke(obj,args);
		} catch (IllegalAccessException e) {
			LOGGER.error("invoke method failure,method : "+method+", args : "+args,e);
			throw new RuntimeException(e);
		} catch (IllegalArgumentException e) {
			LOGGER.error("invoke method failure,method : "+method+", args : "+args,e);
			throw new RuntimeException(e);
		} catch (InvocationTargetException e) {
			LOGGER.error("invoke method failure,method : "+method+", args : "+args,e);
			Throwable cause = e.getCause();
			if(cause != null){
				if(cause instanceof RestException){
					//Rest中断异常,需要返回前台异常信息
					throw (RestException)e.getCause();
				}else if(cause instanceof RedirectorInterrupt){
					//重定向中断,需要跳转
					throw (RedirectorInterrupt)e.getCause();
				}else{
					throw new RuntimeException(cause);
				}
			}else{
				throw new RuntimeException(e);
				
			}
		}*/
    return result;
}
Also used : ArrayList(java.util.ArrayList) RestException(org.axe.exception.RestException) MethodHandle(java.lang.invoke.MethodHandle) RedirectorInterrupt(org.axe.exception.RedirectorInterrupt)

Example 2 with RedirectorInterrupt

use of org.axe.exception.RedirectorInterrupt in project Axe by DongyuCai.

the class DispatcherServlet method service.

@Override
public void service(HttpServletRequest request, HttpServletResponse response) {
    String contentType = ContentType.APPLICATION_JSON.CONTENT_TYPE;
    String characterEncoding = CharacterEncoding.UTF_8.CHARACTER_ENCODING;
    List<Filter> doEndFilterList = null;
    try {
        //获取请求方法与请求路径
        String requestMethod = RequestUtil.getRequestMethod(request);
        String requestPath = RequestUtil.getRequestPath(request);
        if (requestPath != null && requestPath.equals("/favicon.ico")) {
            return;
        }
        //获取 Action 处理器
        Handler handler = ControllerHelper.getHandler(requestMethod, requestPath);
        if (handler != null) {
            //获取 Controller  类和 Bean 实例
            Class<?> controllerClass = handler.getControllerClass();
            Method actionMethod = handler.getActionMethod();
            Object controllerBean = BeanHelper.getBean(controllerClass);
            contentType = handler.getContentType();
            characterEncoding = handler.getCharacterEncoding();
            //##1.创建你请求参数对象
            Param param;
            if (FormRequestHelper.isMultipart(request)) {
                //如果是文件上传
                param = FormRequestHelper.createParam(request, requestPath, handler.getMappingPath());
            } else {
                //如果不是
                param = AjaxRequestHelper.createParam(request, requestPath, handler.getMappingPath());
            }
            //                List<Object> actionParamList = this.convertRequest2RequestParam(actionMethod, param, request, response);
            //                param.setActionParamList(actionParamList);
            //##2.先执行Filter链
            List<Filter> filterList = handler.getFilterList();
            boolean doFilterSuccess = true;
            if (CollectionUtil.isNotEmpty(filterList)) {
                for (Filter filter : filterList) {
                    //被执行的Filter,都添加到end任务里
                    if (doEndFilterList == null) {
                        doEndFilterList = new ArrayList<>();
                    }
                    doEndFilterList.add(filter);
                    doFilterSuccess = filter.doFilter(request, response, param, handler);
                    //执行失败则跳出,不再往下进行
                    if (!doFilterSuccess)
                        break;
                }
            }
            //##3.执行Interceptor 列表
            List<Interceptor> interceptorList = handler.getInterceptorList();
            boolean doInterceptorSuccess = true;
            if (CollectionUtil.isNotEmpty(interceptorList)) {
                for (Interceptor interceptor : interceptorList) {
                    doInterceptorSuccess = interceptor.doInterceptor(request, response, param, handler);
                    if (!doInterceptorSuccess)
                        break;
                }
            }
            //##4.执行action
            if (doFilterSuccess && doInterceptorSuccess) {
                //调用 Action方法
                List<Object> actionParamList = this.convertRequest2RequestParam(actionMethod, param, request, response);
                Object result = ReflectionUtil.invokeMethod(controllerBean, actionMethod, actionParamList.toArray());
                if (result != null) {
                    if (result instanceof View) {
                        handleViewResult((View) result, request, response);
                    } else if (result instanceof Data) {
                        handleDataResult((Data) result, response, handler);
                    } else {
                        Data data = new Data(result);
                        handleDataResult(data, response, handler);
                    }
                }
            }
        } else {
            //404
            throw new RestException(RestException.SC_NOT_FOUND, "404 Not Found");
        }
    } catch (RedirectorInterrupt e) {
        //被中断,跳转
        View view = new View(e.getPath());
        try {
            handleViewResult(view, request, response);
        } catch (Exception e1) {
            LOGGER.error("中断,跳转 error", e);
        }
    } catch (RestException e) {
        //需要返回前台信息的异常
        writeError(e.getStatus(), e.getMessage(), response, contentType, characterEncoding);
    } catch (Exception e) {
        LOGGER.error("server error", e);
        //500
        writeError(RestException.SC_INTERNAL_SERVER_ERROR, "500 server error", response, contentType, characterEncoding);
        try {
            //邮件通知
            MailHelper.errorMail(e);
        } catch (Exception e1) {
            LOGGER.error("mail error", e1);
        }
    } finally {
        //##5.执行Filter链各个节点的收尾工作
        if (CollectionUtil.isNotEmpty(doEndFilterList)) {
            for (Filter filter : doEndFilterList) {
                try {
                    filter.doEnd();
                } catch (Exception endEx) {
                    LOGGER.error("filter doEnd failed", endEx);
                }
            }
        }
    }
}
Also used : RestException(org.axe.exception.RestException) Handler(org.axe.bean.mvc.Handler) Data(org.axe.bean.mvc.Data) Method(java.lang.reflect.Method) View(org.axe.bean.mvc.View) ServletException(javax.servlet.ServletException) RestException(org.axe.exception.RestException) IOException(java.io.IOException) Filter(org.axe.interface_.mvc.Filter) RequestParam(org.axe.annotation.mvc.RequestParam) Param(org.axe.bean.mvc.Param) Interceptor(org.axe.interface_.mvc.Interceptor) RedirectorInterrupt(org.axe.exception.RedirectorInterrupt)

Aggregations

RedirectorInterrupt (org.axe.exception.RedirectorInterrupt)2 RestException (org.axe.exception.RestException)2 IOException (java.io.IOException)1 MethodHandle (java.lang.invoke.MethodHandle)1 Method (java.lang.reflect.Method)1 ArrayList (java.util.ArrayList)1 ServletException (javax.servlet.ServletException)1 RequestParam (org.axe.annotation.mvc.RequestParam)1 Data (org.axe.bean.mvc.Data)1 Handler (org.axe.bean.mvc.Handler)1 Param (org.axe.bean.mvc.Param)1 View (org.axe.bean.mvc.View)1 Filter (org.axe.interface_.mvc.Filter)1 Interceptor (org.axe.interface_.mvc.Interceptor)1