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設定預設分頁屬性
你是不是還是在方法體裡宣告Pageable物件固定屬性呢?
更優雅的在這裡:
@PageableDefault(page = 2,size = 7,sort = "username,asc")Pageable pageable
3. 如何再@RequestMapping註解上寫正則
@RequestMapping("/user/{id:\\d+}")
id只能是數字
4. @JsonView註解自定義返回內容
比如User類有兩個屬性,一個username一個password。 我們想在controller返回裡,返回User實體的時候不返回password屬性。
4.1 設定檢視
首先需要在實體類裡宣告兩個介面
public interface UserSimpleView{};
public interface UserDetailView extends UserSimpleView{};
複製程式碼
然後,在一定要顯示的欄位的get方法上新增@JsonView(UserSimpleView.class)
註解。
在不一定要顯示的欄位的get方法上新增@JsonView(UserDetailView .class)
註解。
User.java 完整程式碼
public class User {
// jsonView 設定檢視
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 將實體類的get方法上的註解和Controller裡相對應 如果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;
}
複製程式碼
上面這個controller方法,我們看到@JsonView(User.UserDetailView.class)
所以它會。如果變成返回全部的User屬性資訊@JsonView(User.UserSimpleView.class)
,它就只返回username欄位資訊。因為User類和Controller類中@JsonView註解一一對應。
5. 判斷某個欄位不為空
我們都知道,post方法,需要用@RequestBody接收實體類資訊。如果我們再方法裡判斷某個屬性是否為空然後再拋錯,必然增加程式碼量,不美觀。所以我們可以配合幾個註解來達到我們的要求。
5.1 首先在實體類欄位上新增註解@NotBlank
@NotBlank //不為空的註解
private String password;
複製程式碼
5.2 在Controller裡的@RequestBody前加註解@Valid
@PostMapping("/user")
public User create(@Valid @RequestBody User user){}
複製程式碼
但是光這兩個註解作用下,如果密碼出現了空值,程式會直接報錯,我們希望程式可以正常執行,然後把報錯資訊列印出來就可以,於是我們還需要加一個類。BindingResult
5.3 新增BindingResult引數
@PostMapping("/user")
public User create(@Valid @RequestBody User user, BindingResult errors){}
複製程式碼
那如何獲取錯誤資訊呢?看下面的完整程式碼。
5.4 完整程式碼
@PostMapping("/user")
public User create(@Valid @RequestBody User user, BindingResult errors){
user.setId("1");
//列印錯誤資訊
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;
}
複製程式碼
但是你一看控制檯列印資訊你會發現may not be empty
,你都不知道是什麼欄位為空報錯的,我們我們把欄位資訊列印出來。但是又顯得程式碼很長。所以我們可以用@NotBlank的message屬性來自定義message。
除了@NotBlank外,還有一些類似常用的註解。
- @NotNull 值不能為空
- @NotEmpty 字串不能為空,集合不能為空
- @Range(min=,max=) 數字必須大於min小魚max
- @Max(value=) 設定最大值同理還有 @Min(value=)
- @Email 字元必須是Email型別
- @Length(min= ,max= ) 字串長度設定
- @URL 字串是url