美文网首页
@RequestParam和@exceptionHandler

@RequestParam和@exceptionHandler

作者: 寻找傅里叶 | 来源:发表于2021-06-21 14:07 被阅读0次

    @RequestParam

    在使用Spring Boot的过程中,经常使用的是@RequestParam,可以获得请求参数值的解析。
    它有四个属性:

    • valueurl中的参数名要与其值一致
    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello(@RequestParam(value = "name", required = false) String firstName, String lastName) {
            return "hello " + firstName + ' ' + lastName;
        }
    }
    

    调用结果:

    ~ curl --location --request GET 'localhost:8080/hello?name=little&lastName=may'
    hello little may
    ~ curl --location --request GET 'localhost:8080/hello?firstName=little&lastName=may'
    hello null may
    
    • name:与value一样,实际上互为别名

    @RequestParam(name = "name", required = false) String firstName@RequestParam(value = "name", required = false) String firstName是一样的

    • required:默认为true

    如果不指明为false,则value或者name值与传入参数名不一致时,会报错。

    • defaultValue:当参数没有传入时的默认值
    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello(@RequestParam(name = "name", defaultValue = "big") String firstName, String lastName) {
            return "hello " + firstName + ' ' + lastName;
        }
    }
    

    调用结果:

     ~ curl --location --request GET 'localhost:8080/hello?firstName=little&lastName=may'
    hello big may
    

    比较特别的是,如果不显式使用RequestParam,相当于对于该参数默认使用了@RequestParam(required=false, name=参数名)

    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello(String firstName, String lastName) {
            return "hello " + firstName + ' ' + lastName;
        }
    }
    

    调用结果:

     ~ curl --location --request GET 'localhost:8080/hello?firstName=little&lastName=may'
    
    hello little may
     ~ curl --location --request GET 'localhost:8080/hello?firstName1=little&lastName=may'
    hello null may
    

    @exceptionHandler

    实际开发中通常出现一些不可预料的错误,比如数据库查询语句错误,或者空指针,请求第三方超时之类的错误。需要些很多try...catch,才能尽可能覆盖所有可能出现的错误。一般处理的方式是将响应统一封装,然后指定错误码,不将错误信息暴露给前端,可以采用exceptionHandler进行全局的统一异常增强处理。

    利用@RestControllerAdvice,可以不需要使用@ResponseBody

    // GlobalExceptionHandler.java
    package com.littlemay.spring.demo.handler;
    
    import org.springframework.http.HttpStatus;
    import org.springframework.web.bind.annotation.*;
    
    @RestControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(Exception.class)
        @ResponseStatus(code= HttpStatus.INTERNAL_SERVER_ERROR)
        public String exceptionHandler(Exception e){
    // 通常在此进行log打印,重新封装响应进行返回
            System.out.println(e.getMessage());
            return "服务器开小差了~~";
        }
    }
    

    测试:

    // Hello.java
    package com.littlemay.spring.demo.controller;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello() {
            double t = 1 / 0;
            return "hello";
        }
    }
    

    调用结果:

    ~ curl --location --request GET 'localhost:8080/hello'
    服务器开小差了~~
    

    相关文章

      网友评论

          本文标题:@RequestParam和@exceptionHandler

          本文链接:https://www.haomeiwen.com/subject/nrssyltx.html