@valid not working@postmapping spring boot

hts6caw3  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(359)

我正在学习springboot,我正在为@postmapping添加验证,但不知怎么的,它总是创建一个对象,即使它的值无效。
医院.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;
    }

控制器

@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>

之前我在使用spring2.3.10版本时添加了下面的依赖项,但是它不起作用,所以我添加了上面的依赖项。

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

0x6upsns1#

我创建了一个复制代码状态的测试应用程序。正如评论中所说的,你提供的代码肯定能用。你绝对不需要提供 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);
    }
}

现在,我的请求就是这样:
姓名问候结果表400StephenMonsieur200Claranull200Jennymadamme200
从上表可以看出,什么时候 greetingnull 结果是ok状态。如果你想保证字符串至少 min 字符长且不为空,您需要显式地声明它。
例如,如果您想验证可选字段(如手机号码)的话。你知道,它应该有n个数字长,并且只包含数字,但是你不想强制它。就像我上面的问候。

7cjasjjr

7cjasjjr2#

您需要将bindingresult对象作为紧跟在窗体对象之后的参数注入,然后手动检查是否有任何错误。
看到了吗https://spring.io/guides/gs/validating-form-input/ 创建一个web控制器,这是一个很好的示例,说明如何在控制器中执行此操作。

相关问题