自定义spring mvc的json视图实现思路解析

作者:王森 时间:2023-03-12 12:04:44 

场景

我们团队现在面临着多端数据接口对接的问题,为了解决这个问题我们定义了接口对接的规范,

前端(安卓,Ios,web前端)和后端进行了数据的格式规范的讨论,确定了json的数据格式:


{
"code":"200",
"data":{"":""},
"message":"处理成功"
}
{
"code":"300",
"data":{"":""},
"message":"没有此用户"
}

code代表请求处理状态:200为正常处理,300为业务异常处理,500就系统异常处理。

data代表后台返回的数据。

message后台的提示语,正常或者成功的时候会返回错误原因。

问题来了

让每一个人对每一个json视图的返回值都要进行包装的话,岂不很麻烦,

这个时候AOP就登场了,我们可以利用aop的思想在请求返回json之后还未response到客户端时为其包装上一层。

实现步骤

启用aop


<!-- base-package 如果多个,用“,”分隔 -->
 <context:component-scan base-package="com.we,cn.isuyang">
   <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
   <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
 </context:component-scan>
 <!-- 打开aop 注解 -->
 <aop:aspectj-autoproxy />

创建切面


/**
* json返回切面
* <p>
* 用于处理json返回结果
*
* @author  ZhuangJunxiang(529272571@qq.com)
* @Date   2017年4月28日  
*/
@Component
@Aspect
@Order(2)
public class JsonReturnAspect {

/**
  * 设置分页默认值
  * <p>
  * 如果分页没有设置值,则默认从系统的配置文件里读取
  *
  * @param pjp 切点
 */
 @Around(value = "@annotation(org.springframework.web.bind.annotation.ResponseBody)")
 @Order(1)
 public Object warp(final ProceedingJoinPoint pjp) throws Throwable {
   Object list = pjp.proceed();
   if (isReturnVoid(pjp)) {
     HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
         .getResponse();
     if (isNeedWrap(pjp)) {
       response.getWriter().write(JsonUtil.toJson(success("操作成功")));
     }
     return list;
   }
   return data(list);
 }
 /**
  * 是否需要包裹
  *
  * @param pjp 切点
  *
  * @return true表示不需要
 */
 private boolean isNeedWrap(final ProceedingJoinPoint pjp) {
   Method method = AspectUtil.getMethod(pjp);
   return !method.isAnnotationPresent(Void.class);
 }
 /**
  * 是否返回空
  *
  * @param pjp
  * @return true:返回类型为void,false:返回类型不是void
 */
 private boolean isReturnVoid(ProceedingJoinPoint pjp) {
   Method method = AspectUtil.getMethod(pjp);
   Class<?> returnType = method.getReturnType();
   return "void".equals(returnType.getName());
 }

/**
  * 构建成功后的返回对象
  * <p>
  * 消息为空时,不提示,不为空则进行提示
  *
  * @param message 成功消息
  * @return json对象
  */
 public static Map<String, Object> success(final String message) {
   Map<String, Object> map = MapUtil.map();
   map.put("code", StatusCode.SUCCESS.key());
   map.put("message", message);
   map.put("data","");
   return map;
 }    
 /**
  * 构建成功后的返回对象
  * <p>
  * 消息为空时,不提示,不为空则进行提示
  *
  * @param message 成功消息
  * @return json对象
  */
 public static Map<String, Object> data(final Object data) {
   Map<String, Object> map = MapUtil.map();
   map.put("code", StatusCode.SUCCESS.key());
   map.put("message", message);
   map.put("data",data);
   return map;
 }    
}

分析一下

@Component 这个注解表示将这个对象交给spring容器进行实例化

@Aspect 表示这是一个切面类

@Around(value = "@annotation(org.springframework.web.bind.annotation.ResponseBody)")

表示凡是方法上带有@ResponseBody注解的都是这个切面中切点,换句话说都会被拦截。

注意:

warp方法中的ProceedingJoinPoint参数只有环绕通知才可以使用JoinPoint的子类ProceedingJoinPoint,

各连接点类型可以调用代理的方法,并获取、改变返回值。否则就是用JoinPoint。

情况一:假设conroller类中的函数不需要任何返回值

比如:我对一个实体对象进行更新我只需要把更新结果返回去就OK了,不需要填充数据

返回的数据格式:


{
"code":"200",
"data":"",
"message":"处理成功"
}

实现思路:

在切面处理类的处理函数中获取到这个函数的返回值类型如果是void就返回指定格式的数据。
上面的isReturnVoid()就是做这样的一个判断。

你只需要将函数的返回值为void即可:


@RequestMapping
@ResponseBody
public void add(long matchId, Model model) {
 slxSignupViewService.setAddInfo(matchId, model);
}

情况二:假设conroller类中的函数的返回值不需要包裹呢

比如:

某些前端插件以及第三方对接(支付)的返回值是规定好的,

以及下载文件,我们这些就是多余了,

实现思路:

自定一个@Void的注解:


/**
* 空注解
* <p>
* 用于标识将controller层中的返回值原模原样的out出去
*
* @author  WangSen(wangsenhehe@126.com)
* @Date   2017年8月17日  
*/
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Void {
}

在controller层的方法上添加这个注解


/**
 * 支付完成
 */
@Void
@ResponseBody
@RequestMapping
public void payFinish() throws IOException {
   alipayViewService.payFinish();
}

在这个切面处理类上判断这个函数是否包含这个注解如果包含

就不作处理,原模原样的返回出去。

JsonReturnAspect类中的isNeedWrap()方法就是处理这个需求。

总结

以上所述是小编给大家介绍的自定义spring mvc的json视图实现思路解析网站的支持!

来源:http://www.cnblogs.com/wangsen/p/8031283.html

标签:spring,mvc,json,视图
0
投稿

猜你喜欢

  • Android 实现闪屏页和右上角的倒计时跳转实例代码

    2022-12-10 17:32:32
  • 分享两种实现Winform程序的多语言支持的多种解决方案

    2023-10-17 21:24:17
  • Java中synchronized的几种使用方法

    2023-06-19 16:33:28
  • String concat(String str)使用小结

    2023-02-28 05:52:13
  • Java单例模式简单示例

    2022-04-24 03:46:20
  • C#实现生成所有不重复的组合功能示例

    2023-04-18 15:49:43
  • C#控制台程序如何发布到服务器Linux上运行

    2022-07-17 05:57:52
  • sharding-jdbc5.0.0实现分表实践

    2023-12-07 10:12:26
  • Java中常见的陷阱题及答案

    2021-08-10 16:32:11
  • Android利用手势完成屏幕密码锁功能

    2023-04-08 21:21:40
  • c#获取本机的IP地址的代码

    2021-08-21 08:37:07
  • 详解android 用webview加载网页(https和http)

    2021-12-29 11:14:30
  • Android 实现手机接通电话后振动提示的功能

    2022-01-10 23:56:58
  • spring boot 2.x html中引用css和js失效问题及解决方法

    2021-08-13 10:28:32
  • spring cloud Feign使用@RequestLine遇到的坑

    2023-12-15 09:18:16
  • java文字转语音播报功能的实现方法

    2022-05-08 18:44:41
  • 20.5 语音合成(百度2016年2月29日发布的tts引擎)

    2022-06-26 06:55:01
  • Java单元测试工具之JUnit的使用

    2022-09-05 13:20:54
  • C#实现提取Word中插入的多媒体文件(视频,音频)

    2022-09-06 14:45:20
  • 详解Android(共享元素)转场动画开发实践

    2021-09-28 21:33:41
  • asp之家 软件编程 m.aspxhome.com