目的: 各情况类型的接口入参接收处理
- 入参规范很重要,特别是参数一多
PATH
类型参数:
- 数据详情
http://localhost:8083/one/1
@GetMapping("/one/{id}")
public String one(@PathVariable String id){
return "id:"+id;
}
- 数据详情
http://localhost:8083/param/oneDel/1,2,3,4,5
@DeleteMapping("/oneDel/{id}")
public String oneDel(@PathVariable String[] id){
//or List<String> id
return "id:"+ Arrays.toString(id);
}
QUERY
类型参数:
- 数据详情
http://localhost:8083/param/tow?id=1
@GetMapping("/tow")
public String tow(String id){
return "id:"+id;
}
QUERY
类型参数:
- 数据详情
http://localhost:8083/param/three?name=小树&age=18&sex=1
@GetMapping("/three")
public String three(@RequestParam Map<String,Object> param){
return "param:"+param;
}
@GetMapping("/four")
public String four(User user){
return "user:"+user;
}
BODY
类型参数:
- 数据详情
http://localhost:8083/param/five
{
"name":"小树",
"age":18,
"sex":1
}
@PostMapping("/five")
public String five(@RequestBody User user){
return user.toString();
}
参数校检 (不同类型异常,返回提示):
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.stream.Collectors;
/**
* @author 小树
*/
@ControllerAdvice
public class WebExceptionHandler {
/**
* 处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Result MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
//下边ResultCodeEnum.PARAMS_BS_ERROR.getCode()就是你自己自定义的返回code码
return new Result().setCode(500).setMsg(message).setData(null);
}
/**
* 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常
*/
@ExceptionHandler(BindException.class)
@ResponseBody
public Result BindExceptionHandler(BindException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return new Result().setCode(500).setMsg(message).setData(null);
}
/**
* 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是ConstraintViolationException
*/
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public Result ConstraintViolationExceptionHandler(ConstraintViolationException e) {
String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
return new Result().setCode(500).setMsg(message).setData(null);
}
}
普通路径参数:
@GetMapping("/getInfo")
public Object get(@Valid @NotNull(message = "id不能为空") Integer id){
return id;
}
所有情况都校检:
@PostMapping("/toDo")
public Object toDo(@Validated User user){
return user;
}
@Data
public class User {
@NotEmpty(message = "用户名不能为空")
private String name;
private Integer age;
private Integer sex;
}
添加、编辑时校检
/**
* 新增分组,新增时检查
*/
public interface ValidGroupInsert {
}
/**
* 编辑时检查
*/
public interface ValidGroupEdit {
}
@Data
public class User {
@NotEmpty(message = "用户名不能为空")
private String name;
@NotNull(message = "年龄不能为空",groups = {
ValidGroupInsert.class, ValidGroupEdit.class})
private Integer age;
private Integer sex;
}
@PostMapping("/add")
public Object add(@Validated({
ValidGroupInsert.class, ValidGroupEdit.class})
@RequestBody User user){
return user;
}