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