分享一个关于Json数据自动注入到controller方法参数的方案,有更好的方案大家可以一块讨论,抛砖引玉。
原理:
定义注解@JsonBody
全局拦截器解析注解
替换Controller 方法中带有@JsonBody的参数
定义注解:
@Documented @Retention(RUNTIME) @Target(PARAMETER) public @interface JsonBody { /** * 是否对Json内容根据注解进行校验 * @return */ public boolean validate() default true; }
定义拦截器:
/** * 该拦截器使得json格式的数据也能作为action的参数 * * @author ThinkPad * @param <T> * */ public class JsonInterceptor implements Interceptor { private static final String jsonType = "application/json"; @Override public void intercept(Invocation inv) { Controller controller = inv.getController(); String contentType = controller.getRequest().getContentType(); Parameter[] parameters = inv.getMethod().getParameters(); JsonBody jsonBody = null; // 判断contentType 是否包含 application/json if (contentType != null && contentType.indexOf(jsonType) > -1) { for (int i = 0; i < parameters.length; i++) { jsonBody = parameters[i].getAnnotation(JsonBody.class); if (jsonBody != null) { Class<?> T = parameters[i].getType(); Object result = null; try { result = JsonKit.parse(controller.getRawData(), T); } catch (Exception e) { throw new BadRequestException("Bad Request"); } if (result != null && jsonBody.validate()) { ValidationUtil.checkValidation(result); } // 替换原先的参数 inv.setArg(i, result); } } } inv.invoke(); } }
添加全局拦截器:
@Override public void configInterceptor(Interceptors me) { //耗时拦截器 me.addGlobalActionInterceptor(new ActionPerformanceLoggingInterceptor()); // 异常处理拦截器 me.addGlobalActionInterceptor(new AppExceptionInterceptor()); // 认证信息拦截器 me.addGlobalActionInterceptor(new AuthenInterceptor()); //请求是否来自mobile,便于业务处理 me.addGlobalActionInterceptor(new MobileInterceptor()); //参数校验 me.addGlobalActionInterceptor(new RequestParasValidator()); //json 拦截,使得json参数也能作为action的参数,放在方法参数上 me.addGlobalActionInterceptor(new JsonInterceptor()); //异步方法 me.addGlobalServiceInterceptor(new AsyncInterceptor()); //对service或者dao等非controller层增加时间记录 me.addGlobalServiceInterceptor(new LogExecutionTimeInterceptor()); }
使用:
@NoNeedLogin public void getToken(@JsonBody SysUser user) { String token = this.authenticationService.getToken(user.getUsername(), user.getPassword()); renderResult(token); }
具体代码详见:
https://gitee.com/git_zhanglong/future
该工程持续集成jfinal相关解决方案,欢迎点赞关注
关注我的公众号,免费获取Java + Jfinal学习视频