如何用 SpringBoot 優雅的寫程式碼

微笑面對生活發表於2018-04-05

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

6 自定義註解簡便開發

介紹下我的所有文集:

流行框架

SpringCloud

springboot

nginx

redis

底層實現原理:

Java NIO教程

Java reflection 反射詳解

Java併發學習筆錄

Java Servlet教程

jdbc元件詳解

Java NIO教程

Java語言/版本 研究

相關文章