当前位置:   article > 正文

SpringBoot实战(九):标准化json返回值_wrapmapper

wrapmapper

强烈推荐一个大神的人工智能的教程:http://www.captainai.net/zhanghan​

【前言】

       前后端分离是现在系统开发主流模式,上篇博文《SpringBoot集成Swagger》介绍了利器Swagger;这篇接着定义返回Json格式的规范;无规矩,不成方圆;有了好的规范前后端的开发效率将大大提高;

【返回Json结果规范化】

         一、规范化的必要性

               1、未规范化痛点:

                     返回格式杂乱,前后端不能用统一的工具类去处理,极大拖延联调进度;

               2、规范化爽点:

                     返回格式统一,前后端都可以用统一的工具类去处理,极大推进了联调进度;

         二、如何改造:

               1、项目中增加Wrapper

  1. /*
  2. * Copyright (c) 2019. zhanghan_java@163.com All Rights Reserved.
  3. * 项目名称:实战SpringBoot
  4. * 类名称:Wrapper.java
  5. * 创建人:张晗
  6. * 联系方式:zhanghan_java@163.com
  7. * 开源地址: https://github.com/dangnianchuntian/springboot
  8. * 博客地址: https://blog.csdn.net/zhanghan18333611647
  9. */
  10. package com.zhanghan.zhboot.util.wrapper;
  11. import com.fasterxml.jackson.annotation.JsonIgnore;
  12. import com.fasterxml.jackson.databind.annotation.JsonSerialize;
  13. import lombok.Data;
  14. import java.io.Serializable;
  15. /**
  16. * The class Wrapper.
  17. *
  18. * @param <T> the type parameter @author https://blog.csdn.net/zhanghan18333611647
  19. */
  20. @Data
  21. @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
  22. public class Wrapper<T> implements Serializable {
  23. /**
  24. * 序列化标识
  25. */
  26. private static final long serialVersionUID = 3782350118017398556L;
  27. /**
  28. * 成功码.
  29. */
  30. public static final int SUCCESS_CODE = 0;
  31. /**
  32. * 成功信息.
  33. */
  34. public static final String SUCCESS_MESSAGE = "操作成功";
  35. /**
  36. * 错误码.
  37. */
  38. public static final int ERROR_CODE = 1;
  39. /**
  40. * 错误信息.
  41. */
  42. public static final String ERROR_MESSAGE = "内部异常";
  43. /**
  44. * 编号.
  45. */
  46. private int code;
  47. /**
  48. * 信息.
  49. */
  50. private String message;
  51. /**
  52. * 结果数据
  53. */
  54. private T result;
  55. /**
  56. * Instantiates a new wrapper. default code=0
  57. */
  58. Wrapper() {
  59. this(SUCCESS_CODE, SUCCESS_MESSAGE);
  60. }
  61. /**
  62. * Instantiates a new wrapper.
  63. *
  64. * @param code the code
  65. * @param message the message
  66. */
  67. Wrapper(int code, String message) {
  68. this(code, message, null);
  69. }
  70. /**
  71. * Instantiates a new wrapper.
  72. *
  73. * @param code the code
  74. * @param message the message
  75. * @param result the result
  76. */
  77. Wrapper(int code, String message, T result) {
  78. super();
  79. this.code(code).message(message).result(result);
  80. }
  81. /**
  82. * Sets the 编号 , 返回自身的引用.
  83. *
  84. * @param code the new 编号
  85. *
  86. * @return the wrapper
  87. */
  88. private Wrapper<T> code(int code) {
  89. this.setCode(code);
  90. return this;
  91. }
  92. /**
  93. * Sets the 信息 , 返回自身的引用.
  94. *
  95. * @param message the new 信息
  96. *
  97. * @return the wrapper
  98. */
  99. private Wrapper<T> message(String message) {
  100. this.setMessage(message);
  101. return this;
  102. }
  103. /**
  104. * Sets the 结果数据 , 返回自身的引用.
  105. *
  106. * @param result the new 结果数据
  107. *
  108. * @return the wrapper
  109. */
  110. public Wrapper<T> result(T result) {
  111. this.setResult(result);
  112. return this;
  113. }
  114. /**
  115. * 判断是否成功: 依据 Wrapper.SUCCESS_CODE == this.code
  116. *
  117. * @return code =0,true;否则 false.
  118. */
  119. @JsonIgnore
  120. public boolean success() {
  121. return Wrapper.SUCCESS_CODE == this.code;
  122. }
  123. /**
  124. * 判断是否成功: 依据 Wrapper.SUCCESS_CODE != this.code
  125. *
  126. * @return code !=0,true;否则 false.
  127. */
  128. @JsonIgnore
  129. public boolean error() {
  130. return !success();
  131. }
  132. }

               2、项目中增加WrapMapper

  1. /*
  2. * Copyright (c) 2019. zhanghan_java@163.com All Rights Reserved.
  3. * 项目名称:实战SpringBoot
  4. * 类名称:WrapMapper.java
  5. * 创建人:张晗
  6. * 联系方式:zhanghan_java@163.com
  7. * 开源地址: https://github.com/dangnianchuntian/springboot
  8. * 博客地址: https://blog.csdn.net/zhanghan18333611647
  9. */
  10. package com.zhanghan.zhboot.util.wrapper;
  11. import io.micrometer.core.instrument.util.StringUtils;
  12. /**
  13. * The class Wrap mapper.
  14. *
  15. * @author https://blog.csdn.net/zhanghan18333611647
  16. */
  17. public class WrapMapper {
  18. /**
  19. * Instantiates a new wrap mapper.
  20. */
  21. private WrapMapper() {
  22. }
  23. /**
  24. * Wrap.
  25. *
  26. * @param <E> the element type
  27. * @param code the code
  28. * @param message the message
  29. * @param o the o
  30. * @return the wrapper
  31. */
  32. public static <E> Wrapper<E> wrap(int code, String message, E o) {
  33. return new Wrapper<>(code, message, o);
  34. }
  35. /**
  36. * Wrap.
  37. *
  38. * @param <E> the element type
  39. * @param code the code
  40. * @param message the message
  41. * @return the wrapper
  42. */
  43. public static <E> Wrapper<E> wrap(int code, String message) {
  44. return wrap(code, message, null);
  45. }
  46. /**
  47. * Wrap.
  48. *
  49. * @param <E> the element type
  50. * @param code the code
  51. * @return the wrapper
  52. */
  53. public static <E> Wrapper<E> wrap(int code) {
  54. return wrap(code, null);
  55. }
  56. /**
  57. * Wrap.
  58. *
  59. * @param <E> the element type
  60. * @param e the e
  61. * @return the wrapper
  62. */
  63. public static <E> Wrapper<E> wrap(Exception e) {
  64. return new Wrapper<>(Wrapper.ERROR_CODE, e.getMessage(), null);
  65. }
  66. /**
  67. * Un wrapper.
  68. *
  69. * @param <E> the element type
  70. * @param wrapper the wrapper
  71. * @return the e
  72. */
  73. public static <E> E unWrap(Wrapper<E> wrapper) {
  74. return wrapper.getResult();
  75. }
  76. /**
  77. * Wrap ERROR. code=1
  78. *
  79. * @param <E> the element type
  80. * @return the wrapper
  81. */
  82. public static <E> Wrapper<E> error() {
  83. return wrap(Wrapper.ERROR_CODE, Wrapper.ERROR_MESSAGE, null);
  84. }
  85. /**
  86. * Error wrapper.
  87. *
  88. * @param <E> the type parameter
  89. * @param message the message
  90. * @return the wrapper
  91. */
  92. public static <E> Wrapper<E> error(String message) {
  93. return wrap(Wrapper.ERROR_CODE, StringUtils.isBlank(message) ? Wrapper.ERROR_MESSAGE : message, null);
  94. }
  95. /**
  96. * Wrap SUCCESS. code=0
  97. *
  98. * @param <E> the element type
  99. * @return the wrapper
  100. */
  101. public static <E> Wrapper<E> ok() {
  102. return new Wrapper<>();
  103. }
  104. /**
  105. * Ok wrapper.
  106. *
  107. * @param <E> the type parameter
  108. * @param o the o
  109. * @return the wrapper
  110. */
  111. public static <E> Wrapper<E> ok(E o) {
  112. return new Wrapper<>(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, o);
  113. }
  114. }

               3、修改Controller的返回值(以CheckMobileController为例)

  1. /*
  2. * Copyright (c) 2019. zhanghan_java@163.com All Rights Reserved.
  3. * 项目名称:实战SpringBoot
  4. * 类名称:CheckMobileController.java
  5. * 创建人:张晗
  6. * 联系方式:zhanghan_java@163.com
  7. * 开源地址: https://github.com/dangnianchuntian/springboot
  8. * 博客地址: https://blog.csdn.net/zhanghan18333611647
  9. */
  10. package com.zhanghan.zhboot.controller;
  11. import com.mysql.jdbc.StringUtils;
  12. import com.zhanghan.zhboot.controller.request.MobileCheckRequest;
  13. import com.zhanghan.zhboot.properties.MobilePreFixProperties;
  14. import com.zhanghan.zhboot.util.wrapper.WrapMapper;
  15. import com.zhanghan.zhboot.util.wrapper.Wrapper;
  16. import io.swagger.annotations.Api;
  17. import io.swagger.annotations.ApiOperation;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.validation.annotation.Validated;
  20. import org.springframework.web.bind.annotation.RequestBody;
  21. import org.springframework.web.bind.annotation.RequestMapping;
  22. import org.springframework.web.bind.annotation.RequestMethod;
  23. import org.springframework.web.bind.annotation.RestController;
  24. import java.util.HashMap;
  25. import java.util.Map;
  26. @RestController
  27. @Api(value = "校验手机号控制器",tags = {"校验手机号控制器"})
  28. public class CheckMobileController {
  29. @Autowired
  30. private MobilePreFixProperties mobilePreFixProperties;
  31. @ApiOperation(value="优雅校验手机号格式方式",tags = {"校验手机号控制器"})
  32. @RequestMapping(value = "/good/check/mobile", method = RequestMethod.POST)
  33. public Wrapper goodCheckMobile(@RequestBody @Validated MobileCheckRequest mobileCheckRequest) {
  34. String countryCode = mobileCheckRequest.getCountryCode();
  35. String proFix = mobilePreFixProperties.getPrefixs().get(countryCode);
  36. if (StringUtils.isNullOrEmpty(proFix)) {
  37. return WrapMapper.error("参数错误");
  38. }
  39. String mobile = mobileCheckRequest.getMobile();
  40. Boolean isLegal = false;
  41. if (mobile.startsWith(proFix)) {
  42. isLegal = true;
  43. }
  44. Map map = new HashMap();
  45. map.put("mobile", mobile);
  46. map.put("isLegal", isLegal);
  47. map.put("proFix", proFix);
  48. return WrapMapper.ok(map);
  49. }
  50. @ApiOperation(value="扩展性差校验手机号格式方式",tags = {"校验手机号控制器"})
  51. @RequestMapping(value = "/bad/check/mobile", method = RequestMethod.POST)
  52. public Wrapper badCheckMobile(@RequestBody MobileCheckRequest mobileCheckRequest) {
  53. String countryCode = mobileCheckRequest.getCountryCode();
  54. String proFix;
  55. if (countryCode.equals("CN")) {
  56. proFix = "86";
  57. } else if (countryCode.equals("US")) {
  58. proFix = "1";
  59. } else {
  60. return WrapMapper.error("参数错误");
  61. }
  62. String mobile = mobileCheckRequest.getMobile();
  63. Boolean isLegal = false;
  64. if (mobile.startsWith(proFix)) {
  65. isLegal = true;
  66. }
  67. Map map = new HashMap();
  68. map.put("mobile", mobile);
  69. map.put("isLegal", isLegal);
  70. map.put("proFix", proFix);
  71. return WrapMapper.ok(map);
  72. }
  73. }

         三、效果展示:

               1、启动项目访问 http://localhost:8080/swagger-ui.html

               2、在swagger中访问 校验手机号控制器 中的方法

         四、项目地址及代码版本:

               1、地址:https://github.com/dangnianchuntian/springboot

               2、代码版本:1.2.0-Release

【总结】

         1、约定重要性;

         2、观察在工作中最耗时的工作,不断优化,提高工作效率。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/158006?site
推荐阅读
相关标签
  

闽ICP备14008679号