三种自定义SpringBoot返回的状态码

2019-10-07 21:09:22

参考地址 关于如何自定义SpringBoot返回的状态码

关于如何自定义SpringBoot返回的状态码

关于HttpStatus

在SpringBoot中关于状态码有一个枚举类型,如下。


public enum HttpStatus {

    CONTINUE(100, "Continue"),

    SWITCHING_PROTOCOLS(101, "Switching Protocols"),

    PROCESSING(102, "Processing"),

    CHECKPOINT(103, "Checkpoint"),

    OK(200, "OK"),

    ...

}

1

2

3

4

5

6

7

8

通过以下三种方法均可实现

1. 通过@ResponseStatus注解

eg:


@ResponseStatus(code=HttpStatus.INTERNAL_SERVER_ERROR,reason="server error")

public class ServerException extends Exception {

...

}

1

2

3

4

在全局异常捕捉的类中定义,可以自定义特定的异常来返回特定的状态码。


2. 修改response的status属性

eg:


@RequestMapping(value = "/index", method = RequestMethod.GET)

public void index(HttpServletResponse response) throws IOException{

    response.setStatus(500);

    response.getWriter().append("server error");

}

1

2

3

4

5

需要多加response参数,但这样的控制器都必须为void,有诸多限制。


3. ResponseEntity

eg:


@RequestMapping(value = "/user", method = RequestMethod.GET)

public ResponseEntity<Map<String,Object>> getUser() throws IOException{

    Map<String,Object> map = new HashMap<String,Object>();

    map.put("name", "user");

    return new ResponseEntity<Map<String,Object>>(map,HttpStatus.OK);

}

1

2

3

4

5

6

这样返回类型就只能是ResponseEntity。


前后端分离开发一般都会自定义返回的数据格式。

都会包含msg,code,data三个属性。

可用上述思路实现以下工具类。实现自定义返回的状态码,需将返回格式设置为以下类的格式,将返回数据传入data。


JSONResult.java

public class JSONResult<T> extends ResponseEntity<Message> {


    public JSONResult(HttpStatus status) {

        super(status);

    }


    public JSONResult(String code, String msg, T data) {

        super(Message.custom(code, msg, data), Message.num2HttpStatus(code));

    }


    public JSONResult(String code, String msg) {

        super(Message.custom(code, msg), Message.num2HttpStatus(code));

    }


    public static <T> JSONResult<T> success(T data) {

        return new JSONResult("200", "成功", data);

    }


    public static <T> JSONResult<T> failed(T data) {

        return new JSONResult("422", "失败", data);

    }


    public static <T> JSONResult<T> failMsg(String msg) {

        return new JSONResult("422", msg);

    }


    public static <T> JSONResult<T> custom(String code, String msg, T data) {

        return new JSONResult(code, msg, data);

    }

}


class Message<T> {


    String status;

    //向前端返回的内容

    String message;


    T data;


    public Message() {

    }


    public Message(String status, String message) {

        this.status = status;

        this.message = message;

    }


    public Message(String status, String message, T data) {

        this.data = data;

        this.status = status;

        this.message = message;

    }


    public static <T> Message<T> custom(String status, String message, T data) {

        return new Message(status, message, data);

    }


    public static <T> Message<T> custom(String status, String message) {

        return new Message(status, message);

    }


    public static HttpStatus num2HttpStatus(String code) {

        HttpStatus status = HttpStatus.NOT_FOUND;

        for (HttpStatus httpStatus : HttpStatus.values()) {

            boolean b = Integer.parseInt(code) == httpStatus.value();

            if (b) {

                return httpStatus;

            }

        }

        return status;

    }


    public String getStatus() {

        return status;

    }


    public void setStatus(String status) {

        this.status = status;

    }


    public String getMessage() {

        return message;

    }


    public void setMessage(String message) {

        this.message = message;

    }


    public T getData() {

        return data;

    }


    public void setData(T data) {

        this.data = data;

    }


}


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

通过继承ResponseEntity类来实现自定义返回类的自定义状态码返回。


  • 2018-12-04 15:31:15

    iOS--Pod install && Pod update

    许多人在最初接触CocoaPods时认为pod install只是在第一次为项目设置CocoaPods时使用,之后都应该使用pod update.看起来是这样,但也不是(But that's not the case at all.)。 这篇文章的目的就是教你啥时候用pod install,啥时候用pod update

  • 2018-12-04 15:33:19

    CocoaPods安装和使用教程

    当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等。可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其他类库又用到其他类库,“子子孙孙无穷尽也”,这也许是比较特殊的情况。总之小编的意思就是,手动一个个去下载所需类库十分麻烦。另外一种常见情况是,你项目中用到的类库有更新,你必须得重新下载新版本,重新加入到项目中,十分麻烦。如果能有什么工具能解决这些恼人的问题,那将“善莫大焉”。所以,你需要 CocoaPods。

  • 2018-12-04 23:37:37

    pod install 和 pod update

    当我们新建一个Podfile文件运行后,会自动生成一个Podfile.lock文件,Podfile.lock文件里存储着我们已经安装的依赖库(pods)的版本。 当我们第一次运行Podfile时,如果对依赖库不指定版本的话,cocoapods会安装最新的版本,同时将pods的版本记录在Podfile.lock文件中。这个文件会保持对每个pod已安装版本的跟踪,并且锁定这些版本。

  • 2018-12-04 23:40:26

    pod删除已导入的第三方库和移除项目中的cocoapods

    CocoaPods是一个负责管理iOS项目中第三方开源库的工具。CocoaPods的项目源码在Github上管理。在我们有了CocoaPods这个工具之后,只需要将用到的第三方开源库放到一个名为Podfile的文件中,然后在命令行执行$ pod install命令。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数. 但是如果我们导入的某个第三方不适用,或者我们又不想使用该第三方,那我们又该如何将这些相关的东西从我们的项目中清理出去呢?

  • 2018-12-04 23:41:47

    制作自己的Pod库(公有/私有)

    目的:1.管理自己常用的类;2.组件化开发步骤:1.想一个比较酷的名字,在桌面简历文件夹。2.打开terminal,cd到这个文件夹下面,执行pod lib create  xxx(这里我们以JJCategoryKit为例子,下同)命令,如下图。这个过程会问几个问题,根据实际情况输入回答即可。这里我们选择添加demo,结束的时候会自动Lanuch这个app. 作者:深水日月 链接:https://www.jianshu.com/p/ece0b5721461 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 2018-12-05 06:08:26

    CocoaPods建立私有仓库 spec repo

    好多项目里都有公共的组件,copy来,copy去很容易出错,而且不容易维护,所以就想到用用cocoapods 建自己的私有库,Carthage用法虽然相对简单,但是它是把公共组件都放在framework里不容易单步调试,所以我还是选择用Cocoapods 来建立私有仓库 参考使用Cocoapods创建私有podspec

  • 2018-12-05 15:11:18

    为什么 Objective-C非常难

    作为一个Objective-C的coder,我总能听到一部 分人在这门语言上抱怨有很多问题。他们总在想快速学习这门语言来写一个App出来,但他们也总是联想到Objective-C看上去实在太难了或者在想这 些语法符号都是神马玩意?不错,他们问得非常好,所以本人也解释一下为什么很多程序员相比较学习Ruby或者Java很容易,但在决定开发iOS或者OS X应用时会那么犹豫。

  • 2018-12-05 15:22:23

    十分钟让你明白Objective-C的语法(和Java、C++的对比)

    很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头疼,Objective-C的代码在语法上和Java, C++有着很大的区别,有的同学会感觉像是看天书一样。不过,语言都是相通的,有很多共性。下面列出Objective-C语言的语法和Java,C++的对比,这样你就会很容易Objective-C的语法是怎么回事了。

  • 2018-12-05 15:33:33

    一篇文章看懂有关iOS开发语言的一切!

    OS开发语言有哪些?OS开发语言主要包括什么?iOS开发语言具体怎么学习?今天重点介绍一下: iOS开发语言主要包括:C语言基础、Obiective-C编程、Swift、UIKit框架详解这几大块,在这里项目阶段就不详细的介绍了。 C语言基础 C语言是开发语言的基础,是最常用的一门程序设计语言,最常用于编写计算机程序。

  • 2018-12-06 10:03:36

    定时杀掉processlist sleep状态的线程

    由于程序设计的Bug,导致目前这个项目使用的数据库中有很多Sleep状态的线程。找了很多解决办法,还没发现最终有效的解决方案。只能临时使用如下方法: 编写shell文件,如killSleepProcess.sh