亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

自定義spring mvc的json視圖實(shí)現(xiàn)思路解析

 更新時(shí)間:2017年12月13日 10:36:25   作者:王森  
這篇文章主要介紹了自定義spring mvc的json視圖的實(shí)現(xiàn)思路解析,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下

場(chǎng)景

我們團(tuán)隊(duì)現(xiàn)在面臨著多端數(shù)據(jù)接口對(duì)接的問題,為了解決這個(gè)問題我們定義了接口對(duì)接的規(guī)范,

前端(安卓,Ios,web前端)和后端進(jìn)行了數(shù)據(jù)的格式規(guī)范的討論,確定了json的數(shù)據(jù)格式:

{
"code":"200",
"data":{"":""},
"message":"處理成功"
}
{
"code":"300",
"data":{"":""},
"message":"沒有此用戶"
}

code代表請(qǐng)求處理狀態(tài):200為正常處理,300為業(yè)務(wù)異常處理,500就系統(tǒng)異常處理。

data代表后臺(tái)返回的數(shù)據(jù)。

message后臺(tái)的提示語,正常或者成功的時(shí)候會(huì)返回錯(cuò)誤原因。

問題來了

讓每一個(gè)人對(duì)每一個(gè)json視圖的返回值都要進(jìn)行包裝的話,豈不很麻煩,

這個(gè)時(shí)候AOP就登場(chǎng)了,我們可以利用aop的思想在請(qǐng)求返回json之后還未response到客戶端時(shí)為其包裝上一層。

實(shí)現(xiàn)步驟

啟用aop

 <!-- base-package 如果多個(gè),用“,”分隔 -->
  <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 />

創(chuàng)建切面

/**
 * json返回切面
 * <p>
 * 用于處理json返回結(jié)果
 *
 * @author  ZhuangJunxiang(529272571@qq.com)
 * @Date   2017年4月28日   
 */
@Component
@Aspect
@Order(2)
public class JsonReturnAspect {
    
  /**
   * 設(shè)置分頁默認(rèn)值
   * <p>
   * 如果分頁沒有設(shè)置值,則默認(rèn)從系統(tǒng)的配置文件里讀取
   *
   * @param pjp 切點(diǎn)
  */
  @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 切點(diǎn)
   * 
   * @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());
  } 

  /**
   * 構(gòu)建成功后的返回對(duì)象
   * <p>
   * 消息為空時(shí),不提示,不為空則進(jìn)行提示
   * 
   * @param message 成功消息
   * @return json對(duì)象
   */
  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;
  }    
  /**
   * 構(gòu)建成功后的返回對(duì)象
   * <p>
   * 消息為空時(shí),不提示,不為空則進(jìn)行提示
   * 
   * @param message 成功消息
   * @return json對(duì)象
   */
  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 這個(gè)注解表示將這個(gè)對(duì)象交給spring容器進(jìn)行實(shí)例化

@Aspect 表示這是一個(gè)切面類

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

表示凡是方法上帶有@ResponseBody注解的都是這個(gè)切面中切點(diǎn),換句話說都會(huì)被攔截。

注意:

warp方法中的ProceedingJoinPoint參數(shù)只有環(huán)繞通知才可以使用JoinPoint的子類ProceedingJoinPoint,

各連接點(diǎn)類型可以調(diào)用代理的方法,并獲取、改變返回值。否則就是用JoinPoint。

情況一:假設(shè)conroller類中的函數(shù)不需要任何返回值

比如:我對(duì)一個(gè)實(shí)體對(duì)象進(jìn)行更新我只需要把更新結(jié)果返回去就OK了,不需要填充數(shù)據(jù)

返回的數(shù)據(jù)格式:

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

實(shí)現(xiàn)思路:

在切面處理類的處理函數(shù)中獲取到這個(gè)函數(shù)的返回值類型如果是void就返回指定格式的數(shù)據(jù)。
上面的isReturnVoid()就是做這樣的一個(gè)判斷。

你只需要將函數(shù)的返回值為void即可:

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

情況二:假設(shè)conroller類中的函數(shù)的返回值不需要包裹呢

比如:

某些前端插件以及第三方對(duì)接(支付)的返回值是規(guī)定好的,

以及下載文件,我們這些就是多余了,

實(shí)現(xiàn)思路:

自定一個(gè)@Void的注解:

/**
 * 空注解
 * <p>
 * 用于標(biāo)識(shí)將controller層中的返回值原模原樣的out出去
 * 
 * @author  WangSen(wangsenhehe@126.com)
 * @Date   2017年8月17日   
 */
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Void {
}

在controller層的方法上添加這個(gè)注解

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

在這個(gè)切面處理類上判斷這個(gè)函數(shù)是否包含這個(gè)注解如果包含

就不作處理,原模原樣的返回出去。

JsonReturnAspect類中的isNeedWrap()方法就是處理這個(gè)需求。

總結(jié)

以上所述是小編給大家介紹的自定義spring mvc的json視圖實(shí)現(xiàn)思路解析,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Mybatis中連接查詢和嵌套查詢實(shí)例代碼

    Mybatis中連接查詢和嵌套查詢實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Mybatis中連接查詢和嵌套查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java使用DateTimeFormatter格式化輸入的日期時(shí)間

    Java使用DateTimeFormatter格式化輸入的日期時(shí)間

    這篇文章主要介紹了Java使用DateTimeFormatter格式化輸入的日期時(shí)間,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 使用RedisAtomicLong優(yōu)化性能問題

    使用RedisAtomicLong優(yōu)化性能問題

    這篇文章主要介紹了使用RedisAtomicLong優(yōu)化性能問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • idea查看properties中文變成unicode碼的解決方案

    idea查看properties中文變成unicode碼的解決方案

    這篇文章主要介紹了idea查看properties中文變成unicode碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 使用@PathVariable注解如何實(shí)現(xiàn)動(dòng)態(tài)傳值

    使用@PathVariable注解如何實(shí)現(xiàn)動(dòng)態(tài)傳值

    這篇文章主要介紹了使用@PathVariable注解如何實(shí)現(xiàn)動(dòng)態(tài)傳值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • springBoot中的CORS跨域注解@CrossOrigin詳解

    springBoot中的CORS跨域注解@CrossOrigin詳解

    這篇文章主要介紹了springBoot中的CORS跨域注解@CrossOrigin詳解,通常,服務(wù)于?JS?的主機(jī)(例如?example.com)與服務(wù)于數(shù)據(jù)的主機(jī)(例如?api.example.com)是不同的,在這種情況下,CORS?可以實(shí)現(xiàn)跨域通信,需要的朋友可以參考下
    2023-12-12
  • JAVA JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)詳解

    JAVA JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)詳解

    這篇文章主要介紹了JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)劃分原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java打亂ArrayList生成一個(gè)隨機(jī)序列列表

    Java打亂ArrayList生成一個(gè)隨機(jī)序列列表

    有時(shí)候會(huì)需要將一個(gè)ArrayList或者數(shù)組中的數(shù)字打亂,方便后續(xù)使用,比如隨機(jī)出題、答案選項(xiàng)打亂、連線題打亂、抽獎(jiǎng)號(hào)碼打亂等等,把我自己寫的一段代碼貼出來分享給大家。
    2016-08-08
  • spring 注解如何開啟聲明式事務(wù)

    spring 注解如何開啟聲明式事務(wù)

    這篇文章主要介紹了spring 注解開啟聲明式事務(wù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java字節(jié)碼ByteBuddy使用及原理解析上

    Java字節(jié)碼ByteBuddy使用及原理解析上

    這篇文章主要為大家介紹了Java字節(jié)碼ByteBuddy使用及原理解析上篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評(píng)論