分享一个关于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学习视频