簡體   English   中英

@Valid 不工作 @PostMapping spring 啟動

[英]@Valid Not working @PostMapping spring boot

我正在學習 spring 引導,我正在為 @PostMapping 添加驗證,但不知何故,即使值無效,它總是會創建一個 object。

醫院.java

public class Hospital {
    private Integer id;
    @Size(min = 2)
    private String name;
    @Size(min = 2)
    private String city;

    public Hospital(Integer id, String name, String city) {
        this.id = id;
        this.name = name;
        this.city = city;
    }

Controller

@Autowired
    HospitalData data;
...
@PostMapping("/hospital")
    public ResponseEntity<Hospital> addHospital(@Valid @RequestBody Hospital hospital){
        Hospital newHospital = data.addHospital(hospital);

        URI location = ServletUriComponentsBuilder
        .fromCurrentRequest()
        .path("/{id}")
        .buildAndExpand(newHospital.getId()).toUri();

        return ResponseEntity.created(location).build();
    }

pom.xml

<dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>

之前我在使用 Spring 2.3.10 RELEASE 時添加了以下依賴項,但它不起作用,所以我添加了以上依賴項。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

我創建了一個測試應用程序,再現了您的代碼的 state。 如評論中所述,您提供的代碼肯定可以工作。 您絕對不需要為該方法提供BindingResult Spring 引導引發MethodArgumentNotValidException並因此返回錯誤請求 http 狀態驗證失敗。

我創建了一個包含以下內容的項目:

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.5</version>
</parent>
<properties>
    <java.version>11</java.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

演示實體:

public class DemoEntity {
    @NotNull
    public String name;
    @Size(min = 3)
    public String greeting;
}

演示控制器:

@Controller
public class DemoController {
    @PostMapping("/post")
    public ResponseEntity<DemoEntity> put(@Valid @RequestBody DemoEntity demoEntity) {
        return ResponseEntity.ok(demoEntity);
    }
}

現在,這就是我的請求發生的情況:

姓名 問候 結果
彼得 先生 400
斯蒂芬 先生 200
克拉拉 null 200
珍妮 夫人 200

如上表所示,當greetingnull時,結果為 ok 狀態。 如果要保證字符串的長度至少為min個字符不是 null,則需要明確聲明。

例如,如果您想驗證手機號碼等可選字段。 你知道,它應該是 n 個數字,並且只包含數字,但你不想讓它成為強制性的。 就像我在上面的問候中展示的那樣。

您需要在表單 object 之后將 BindingResult object 作為參數注入,然后手動檢查是否有任何錯誤。

See https://spring.io/guides/gs/validating-form-input/ Create a Web Controller for a good example of how this should be done in your controller.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM