主要是想通过捕获不同的自定义异常来进行不同的业务处理
1 回复
/**
* 该接口只有一个方法
* @param config
* @param ai
* @return
*/
@Override
public ActionChain eval(NutConfig config, ActionInfo ai) {
// 提醒: config可以获取ioc等信息, ai可以获取方法上的各种配置及方法本身
// 正常处理的列表
List<Processor> list = new ArrayList<>();
// 设置base/msg等内置属性
list.add(new UpdateRequestAttributesProcessor());
list.add(new GlobalsSettingProcessor());
// 设置编码信息@Encoding
list.add(new EncodingProcessor());
// 获取入口类的对象,从ioc或直接new
list.add(new ModuleProcessor());
//shiro
list.add(new NutShiroProcessor());
// SQL 注入过滤 XSS过滤
list.add(new XssSqlFilterProcessor());
// 处理@Filters
list.add(new ActionFiltersProcessor());
// 处理@Adaptor
list.add(new AdaptorProcessor());
//必填项做判断
list.add(new ValidationProcessor());
// 执行入口方法
list.add(new MethodInvokeProcessor());
// 对入口方法进行渲染@Ok
list.add(new ViewProcessor());
for (Processor p : list) {
try {
p.init(config, ai);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
// 最后是专门负责兜底的异常处理器,这个处理器可以认为是全局异常处理器,对应@Fail
ErrorProcessor error = new ErrorProcessor();
try {
error.init(config, ai);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return new NutActionChain(list, error, ai);
}
}
/**
* 重写 Error信息处理类
* @Author: Haimming
* @Date: 2019-08-09 16:27
* @Version 1.0
*/
public class ErrorProcessor extends ViewProcessor {
private static final Log log = Logs.get();
public static boolean isAjax(ServletRequest req) {
String value = ((HttpServletRequest)req).getHeader("X-Requested-With");
return value != null && "XMLHttpRequest".equalsIgnoreCase(value.trim());
}
@Override
public void init(NutConfig config, ActionInfo ai) throws Throwable {
view = evalView(config, ai, ai.getFailView());
}
@Override
public void process(ActionContext ac) throws Throwable {
if (log.isWarnEnabled()) {
String uri = Mvcs.getRequestPath(ac.getRequest());
log.warn(String.format("Error@%s :", uri), ac.getError());
}
String msg = "system.paramserror";
if (ac.getError() instanceof ErrorException) {
msg = ac.getError().getMessage();
}
if (ac.getError() instanceof RuntimeException ){
Throwable error = Lang.unwrapThrow(ac.getError());
if(error instanceof FailToCastObjectException){
msg = Mvcs.getMessage(ac.getRequest(),"system.object.exception") + error.getMessage();
}
if(error instanceof NumberFormatException ){
msg = Mvcs.getMessage(ac.getRequest(),"system.object.exception") + error.getMessage();
}
}
//非AJAX 处理
if (isAjax(ac.getRequest())) {
NutShiro.rendAjaxResp(ac.getRequest(), ac.getResponse(), Result.error(msg));
}else {
new HttpStatusView(500).render(
ac.getRequest(),
ac.getResponse(),
Mvcs.getMessage(ac.getRequest(),
msg)
);
}
super.process(ac);
}
}
添加回复
请先登陆