三种自定义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类来实现自定义返回类的自定义状态码返回。


  • 2020-12-06 19:05:13

    visual studio 配置 intellij idea快捷键

    我原本从intellij idea转换到visual studio是因为webstorm没办法远程开发,而visual studio有remote wsl,和remote ssh,看着挺不错的样子。

  • 2020-12-06 20:38:30

    intellij idea远程开发remote

    开发时一般的平台都是windows,但windows对开发极其不友好,一般都会在本地开启虚拟机,安装上linux环境进行项目的部署测试。下面介绍一种windows主机与linux虚拟机代码同步的方法。这个工具适用于jerbrains公司旗下的很多产品,比如idea、webstrom、phpstrom等。但是要注意你安装的IDE必须是专业版的,社区版的IDE是没有这个代码同步功能的哦!

  • 2020-12-07 05:46:56

    npm设置和取消代理的方法

    有时候是设置了全局代理对npm并不生效,不如直接给npm设置代理,至少在mac电脑我是有这种感觉的。

  • 2020-12-07 15:04:03

    node开发邮件系统总结

    因为multipart这种形式比较复杂,因此要利用boundary分割符,将邮件体分割成不同段来进行解析,boundary分为父段和子段,父段一般出现0次或1次,出现在末尾,每个子段中也有content-type和boundary,需要在进行解析,如果遇到i,iii里面的情况可直接解析,如果遇到ii中的情况,再按ii中的步骤进行解析

  • 2020-12-07 15:17:45

    email-templates + mjml 发送邮件

    mjml 是一个很不错的响应式邮件html 内容标签库,email-templates 是一个灵活强大的邮件发送框架,两者集成起来我们 可以设计灵活强大的邮件发送系统,以下是一个简单的集成使用,实际使用还有好多地方需要完善

  • 2020-12-07 15:19:00

    响应式邮件的编写插件介绍mjml

    以前做项目碰到发邮件的需求,邮件模板的编辑就是一件头疼的事。因为虽说邮件是支持 HTML 的,但是确是 HTML 子集程度的支持,所以存在必须通过 <table> 排版的恶心之处,还有很多兼容性的坑。本质上是各家邮件商的标准有差异吧。

  • 2020-12-07 16:14:22

    nodejs队列实现amqplib,rabbitmq

    其中StartConsumer 会在项目启动时启动,在整个生命周期中一直保持监听状态,在程序结束时mq的链接关闭。需要注意的是 noAck 这个参数,当为false是表示消息出队后不会自动删除,如果设置成true,则无论消息处理成功与否此消息会被删除。注意到在消息不成功是,调用了ch.nack(msg)),此方法是将消息重新入队。

  • 2020-12-07 16:15:46

    RabbitMQ详解

    当前市面上mq的产品很多,比如RabbitMQ、Kafka、ActiveMQ、ZeroMQ和阿里巴巴捐献给Apache的RocketMQ。甚至连redis这种NoSQL都支持MQ的功能。 ActiveMQ ActiveMQ是apache出品,最流行的,能力强劲的开源消息总线,并且它一个完全支持JMS规范的消息中间件。其丰富的API、多种集群构建模式使得它成为业界老牌消息中间件,在中小型企业中应用广泛。