1. DTO的使用
如果你的controller代碼寫成這樣
@RequestMapping("/user")
public List query(@RequestParam String username,
@RequestParam String password,
@RequestParam int age){
List<User> users = new ArrayList<>();
users.add(new User());
users.add(new User());
users.add(new User());
return users;
}
那你就需要了解一下什么是DTO了锋勺。
用DTO后的代碼
@RequestMapping("/user")
public List query(UserQueryCondition condition){
System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.DEFAULT_STYLE));
List<User> users = new ArrayList<>();
users.add(new User());
users.add(new User());
users.add(new User());
return users;
}
2. 如何使用PageAble設(shè)置默認(rèn)分頁屬性
你是不是還是在方法體里聲明Pageable對象固定屬性呢蚀瘸?
更優(yōu)雅的在這里:
@PageableDefault(page = 2,size = 7,sort = "username,asc")Pageable pageable
3. 如何再@RequestMapping注解上寫正則
@RequestMapping("/user/{id:\\d+}")
id只能是數(shù)字
4. @JsonView注解自定義返回內(nèi)容
比如User類有兩個(gè)屬性,一個(gè)username一個(gè)password宙刘。
我們想在controller返回里苍姜,返回User實(shí)體的時(shí)候不返回password屬性。
4.1 設(shè)置視圖
首先需要在實(shí)體類里聲明兩個(gè)接口
public interface UserSimpleView{};
public interface UserDetailView extends UserSimpleView{};
然后悬包,在一定要顯示的字段的get方法上添加@JsonView(UserSimpleView.class)
注解衙猪。
在不一定要顯示的字段的get方法上添加@JsonView(UserDetailView .class)
注解。
User.java 完整代碼
public class User {
// jsonView 設(shè)置視圖
public interface UserSimpleView{};
public interface UserDetailView extends UserSimpleView{};
private String useranme;
private String password;
@JsonView(UserSimpleView.class)
public String getUseranme() {
return useranme;
}
public void setUseranme(String useranme) {
this.useranme = useranme;
}
@JsonView(UserDetailView.class)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
注意getUseranme方法上的注解和getPassword上注解的不同布近。
4.2 將實(shí)體類的get方法上的注解和Controller里相對應(yīng)
如果controller只想返回username字段垫释,則
@RequestMapping("/user/{id:\\d+}")
@JsonView(User.UserSimpleView.class)
public User getInfo(@PathVariable int id){
User user = new User();
user.setUseranme("FantJ");
return user;
}
如果想返回全部的User屬性信息,則
@RequestMapping("/user/{id:\\d+}")
@JsonView(User.UserDetailView.class)
public User getInfo(@PathVariable int id){
User user = new User();
user.setUseranme("FantJ");
return user;
}
上面這個(gè)controller方法撑瞧,我們看到@JsonView(User.UserDetailView.class)
所以它會棵譬。如果變成返回全部的User屬性信息@JsonView(User.UserSimpleView.class)
,它就只返回username字段信息预伺。因?yàn)閁ser類和Controller類中@JsonView注解一一對應(yīng)订咸。
5. 判斷某個(gè)字段不為空
我們都知道曼尊,post方法,需要用@RequestBody接收實(shí)體類信息脏嚷。如果我們再方法里判斷某個(gè)屬性是否為空然后再拋錯(cuò)骆撇,必然增加代碼量,不美觀父叙。所以我們可以配合幾個(gè)注解來達(dá)到我們的要求神郊。
5.1 首先在實(shí)體類字段上添加注解@NotBlank
@NotBlank //不為空的注解
private String password;
5.2 在Controller里的@RequestBody前加注解@Valid
@PostMapping("/user")
public User create(@Valid @RequestBody User user){}
但是光這兩個(gè)注解作用下,如果密碼出現(xiàn)了空值趾唱,程序會直接報(bào)錯(cuò)涌乳,我們希望程序可以正常運(yùn)行,然后把報(bào)錯(cuò)信息打印出來就可以甜癞,于是我們還需要加一個(gè)類夕晓。BindingResult
5.3 添加BindingResult參數(shù)
@PostMapping("/user")
public User create(@Valid @RequestBody User user, BindingResult errors){}
那如何獲取錯(cuò)誤信息呢?看下面的完整代碼悠咱。
5.4 完整代碼
@PostMapping("/user")
public User create(@Valid @RequestBody User user, BindingResult errors){
user.setId("1");
//打印錯(cuò)誤信息
if (errors.hasErrors()){
errors.getAllErrors().stream().forEach(p-> System.out.println(p.getDefaultMessage()));
}
System.out.println(user.getId());
System.out.println(user.getUseranme());
System.out.println(user.getPassword());
return user;
}
但是你一看控制臺打印信息你會發(fā)現(xiàn)may not be empty
运授,你都不知道是什么字段為空報(bào)錯(cuò)的,我們我們把字段信息打印出來乔煞。但是又顯得代碼很長吁朦。所以我們可以用@NotBlank的message屬性來自定義message。
除了@NotBlank外渡贾,還有一些類似常用的注解逗宜。
- @NotNull 值不能為空
- @NotEmpty 字符串不能為空,集合不能為空
- @Range(min=,max=) 數(shù)字必須大于min小魚max
- @Max(value=) 設(shè)置最大值同理還有 @Min(value=)
- @Email 字符必須是Email類型
- @Length(min= ,max= ) 字符串長度設(shè)置
- @URL 字符串是url
6 自定義注解簡便開發(fā)
介紹下我的所有文集:
流行框架
SpringCloud
springboot
nginx
redis
底層實(shí)現(xiàn)原理:
Java NIO教程
Java reflection 反射詳解
Java并發(fā)學(xué)習(xí)筆錄
Java Servlet教程
jdbc組件詳解
Java NIO教程
Java語言/版本 研究