Spring MVC 實體參數默認值設置


Spring MVC 實體參數默認值設置


一、實體參數賦值過程

Controller:

@RestController
@RequestMapping("test/")
public class TestController {
    
    @PostMapping("post_test2")
    public Message postTest(@RequestBody QueryConditionsDTO qc) {
        return MessageBox.ok(qc);
    }
    
}

DTO:

@ToString
@Getter
public class QueryConditionsDTO {
    private String strPar;
    private Integer intPar;
    private Date datePar;
    private Integer pageNumber;
    private Integer pageSize;

    public QueryConditionsDTO() {
        System.out.println("QueryConditionsDTO()");
    }

    public QueryConditionsDTO(String strPar, Integer intPar, Date datePar) {
        System.out.println("QueryConditionsDTO(String strPar, Integer intPar, Date datePar)");
        this.strPar = strPar;
        this.intPar = intPar;
        this.datePar = datePar;
    }

    public void setStrPar(String strPar) {
        System.out.println("setStrPar(String strPar)");
        this.strPar = strPar;
    }

    public void setIntPar(Integer intPar) {
        System.out.println("setIntPar(Integer intPar)");
        this.intPar = intPar;
    }

    public void setDatePar(Date datePar) {
        System.out.println("setDatePar(Date datePar)");
        this.datePar = datePar;
    }

    public void setPageNumber(Integer pageNumber) {
        System.out.println("setPageNumber(Integer pageNumber)");
        this.pageNumber = pageNumber;
    }

    public void setPageSize(Integer pageSize) {
        System.out.println("setPageSize(Integer pageSize)");
        this.pageSize = pageSize;
    }
}

HttpClient:

POST http://127.0.0.1:8080/test/post_test2
Content-Type: application/json

{
  "strPar": "str",
  "intPar": 0,
  "datePar": 1609743896044,
  "pageNumber": 0,
  "pageSize": 10
}

HttpClient 控制台輸出:

POST http://127.0.0.1:8080/test/post_test2

HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Mon, 04 Jan 2021 07:21:41 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{
  "status": 1,
  "message": "成功",
  "ok": true,
  "data": {
    "strPar": "str",
    "intPar": 0,
    "datePar": "2021-01-04T07:04:56.044+00:00",
    "pageNumber": 0,
    "pageSize": 10
  },
  "fail": false
}

Response code: 200; Time: 226ms; Content length: 156 bytes

Spring 控制台輸出:

QueryConditionsDTO()
setStrPar(String strPar)
setIntPar(Integer intPar)
setDatePar(Date datePar)
setPageNumber(Integer pageNumber)
setPageSize(Integer pageSize)

從 Spring 控制台輸出的內容可以看出,Spring MVC 實體參數賦值的過程為:

  1. NoArgsConstructor
  2. Setter

java 中對實例屬性進行賦值有4種方式:

  1. 聲明實例屬性時設置初始化
  2. 利用實例初始化代碼塊賦值
  3. 構造方法賦值
  4. 其他方法賦值
public class QueryConditionsDTO {
    // 1.聲明實例屬性時設置初始化
    private Integer pageNumber = 0;
    private Integer pageSize = 30;
    
    // 2.利用實例初始化代碼塊賦值
    {
        this.pageNumber = 0;
        this.pageSize = 30;
    }
    
    // 3.構造方法賦值
    public QueryConditionsDTO() {
        this.pageNumber = 0;this.pageSize = 30;
    }
    public QueryConditionsDTO(Integer pageNumber, Integer pageSize) {
        this.pageNumber = pageNumber;this.pageSize = pageSize;
    }
    
    // 4.其他方法賦值
    public void setPageNumber(Integer pageNumber) {this.pageNumber = pageNumber;}
    public void setPageSize(Integer pageSize) {this.pageSize = pageSize;}
    
}

4種方式執行的先后順序為:1 2 3 4

從上文的測試結果看出,Spring MVC最后一定會調用Setter來設置實體參數的屬性,因此使用1 2 3方式設置的初始值會被覆蓋。所以,如果需要為實體參數的屬性設置默認值,只能在Setter進行。

二、實體參數默認值設置

    public void setPageNumber(Integer pageNumber) {       
        this.pageNumber = pageNumber >= 0 ? pageNumber : 0;
    }
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize >= 0 ? pageSize : 0;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM