<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在定義一個Rest介面時通常會利用GET、POST、PUT、DELETE來實現資料的增刪改查;這幾種方式有的需要傳遞引數,後臺開發人員必須對接收到的引數進行引數驗證來確保程式的健壯性
@PathVaribale 獲取url中的資料
@RequestParam 獲取請求引數的值
@GetMapping 組合註解,是 @RequestMapping(method = RequestMethod.GET) 的縮寫
@RequestBody 利用一個物件去獲取前端傳過來的資料
請求URL:
localhost:8080/hello/id 獲取id值
實現程式碼如下:
@RestController public class HelloController { @RequestMapping(value="/hello/{id}/{name}",method= RequestMethod.GET) public String sayHello(@PathVariable("id") Integer id,@PathVariable("name") String name){ return "id:"+id+" name:"+name; } }
在瀏覽器中 輸入地址:
localhost:8080/hello/100/hello
輸出:
id:81name:hello
獲取url引數值,預設方式,需要方法引數名稱和url引數保持一致
localhost:8080/hello?id=1000
@RestController public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(@RequestParam Integer id){ return "id:"+id; } }
輸出:
id:100
url中有多個引數時,如:
localhost:8080/hello?id=98&&name=helloworld
具體程式碼如下:
@RestController public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(@RequestParam Integer id,@RequestParam String name){ return "id:"+id+ " name:"+name; } }
獲取url引數值,執行引數名稱方式
localhost:8080/hello?userId=1000
@RestController public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(@RequestParam("userId") Integer id){ return "id:"+id; } }
輸出:
id:100
不輸入id的具體值,此時返回的結果為null。具體測試結果如下:
id:null
不輸入id引數,則會報如下錯誤:
whitelable Error Page錯誤
用法:不輸入id時,使用預設值
具體程式碼如下:
localhost:8080/hello
@RestController public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) //required=false 表示url中可以無id引數,此時就使用預設引數 public String sayHello(@RequestParam(value="id",required = false,defaultValue = "1") Integer id){ return "id:"+id; } }
輸出
id:1
常用校驗註解
注意:
接收到的引數預設都是字串型別的
有的註解只能用在String型別的屬性上
@JsonProperty可以實現前端的屬性名和後臺實體類的屬性名不一致問題
校驗方式:
使用@RequestBody @Valid 對JSON引數進行獲取和校驗。
通過BindingResult bindingResult 去獲取校驗結果。
BindingResult 原始碼:
技巧01:利用BindingResult物件的hasErrors方法判斷是否有引數錯誤
技巧02:利用BindingResult物件的getFieldErrors方法獲取所有有引數錯誤的屬性
技巧03:利用錯誤屬性物件的getDefaultMessage去獲取錯誤提示資訊
@RequestMapping(value = "/demo5",produces = MediaType.TEXT_PLAIN_VALUE) @ResponseBody public String test5(@RequestBody @Valid User user , BindingResult bindingResult){ if(bindingResult.hasErrors()){ List<ObjectError> objectErrors = bindingResult.getAllErrors(); System.out.println(objectErrors.toString()); for(ObjectError objectError: objectErrors){ System.out.println("objectError = " + objectError.getObjectName()); System.out.println("objectError = " + objectError.getDefaultMessage()); System.out.println("objectError = " + objectError.getCode()); System.out.println("objectError = " + objectError.getArguments()); } } String str = user.toString(); return str; }
對應User實體類程式碼:
public class User { @NotEmpty(message = "ID不能為空") @NotBlank(message = "ID不能為空喲") private String id; @Min(value = 18) @Max(value = 30) private Integer age; @NotEmpty(message = "暱稱不能為空") @NotBlank(message = "暱稱不能為空喲") @JsonProperty("nickname") // 當前端屬性為nick後臺接收物件的屬性為nickName時可以用@JsonProperty來保持一致 private String name; ....省略get set方法
1、定義一個校驗註解
程式碼如下:
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER, ElementType.FIELD}) @Constraint(validatedBy = MyFormValidatorClass.class) public @interface MyFormValidator { String value(); String message() default "name can be test"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
2、定義一個約束校驗
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.lang.annotation.Annotation; public class MyFormValidatorClass implements ConstraintValidator<MyFormValidator, Object>, Annotation { private String values; @Override public void initialize(MyFormValidator myFormValidator) { this.values = myFormValidator.value(); } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { if("test".equals((String)value)){ return true; } return false; } @Override public Class<? extends Annotation> annotationType() { return null; } }
3、實體類中使用
public class User2 { @NotEmpty(message = "ID不能為空") @NotBlank(message = "ID不能為空喲") //自定義校驗註解-校驗id是否為test @MyFormValidator(value = "abc",message = "dd") private String id; @Min(value = 18) @Max(value = 30) private Integer age; @NotEmpty(message = "暱稱不能為空") @NotBlank(message = "暱稱不能為空喲") @JsonProperty("nickname") // 當前端屬性為nick後臺接收物件的屬性為nickName時可以用@JsonProperty來保持一致
4、測試程式碼:
@RequestMapping(value = "/demo6",produces = MediaType.TEXT_PLAIN_VALUE) @ResponseBody public String test6(@RequestBody @Valid User2 user , BindingResult bindingResult){ if(bindingResult.hasErrors()){ List<ObjectError> objectErrors = bindingResult.getAllErrors(); System.out.println(objectErrors.toString()); for(ObjectError objectError: objectErrors){ System.out.println("objectError = " + objectError.getObjectName()); System.out.println("objectError = " + objectError.getDefaultMessage()); System.out.println("objectError = " + objectError.getCode()); System.out.println("objectError = " + objectError.getArguments()); } } String str = user.toString(); return str; }
當請求引數ID不為test,objectErrors 中有該報錯。
到此這篇關於SpringBoot常見get/post請求引數處理、引數註解校驗及引數自定義註解校驗詳解的文章就介紹到這了,更多相關springboot常見http get post請求引數處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45