Javax 验证不适用于启动休息控制器参数

Javax validation not working on boot rest controller parameter

我在 Spring 引导应用程序中有一个 Pojo(如果有任何区别,则用 Lombok 注释)和一个 RestController。 pojo 方法参数用 @Valid 注释但没有应用验证,即使我添加 BindingResult 第二个参数,它也永远不会有任何错误。我正在使用 Swagger UI 进行测试,发布一个 JSON,但我不明白为什么这会有任何不同......我错过了一些明显的东西吗?

import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Tolerate;
import org.springframework.data.mongodb.core.mapping.Document;

import javax.validation.constraints.NotBlank;


@Data
@EqualsAndHashCode(callSuper = true)
@Builder
public class MyPojo extends GenericDocument {
    @NotBlank
    private String name;

    @Tolerate
    public MyPojo() {
    }
}
import javax.validation.Valid;

@RestController
@RequestMapping(value = "/myUrl", produces = APPLICATION_JSON_VALUE)
public class MyController {
    @PostMapping
    public ResponseEntity<MyPojo> createNew(@RequestBody @Valid MyPojo pojo){...
    }
}

解决方案 添加此依赖项就足够了:

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

奇怪的是,添加 javax.validation:validation-apiorg.hibernate:hibernate-validator 还不够,尽管 documentation

您应该尝试将 Spring 的 @Validated 注释添加到 class 级别的控制器,以告诉 Spring 评估方法参数上的约束注释。

示例:

@Slf4j
@Validated
@RestController
@RequestMapping(value = "/myUrl", produces = APPLICATION_JSON_VALUE)
public class MyController {
    @PostMapping
    public ResponseEntity<MyPojo> createNew(@RequestBody @Valid MyPojo pojo){...
    }
}

org.springframework.validation.annotation.Validated 注释可应用于 class 级别和方法或参数级别。

根据您的类路径中的 documentation, which is not entirely clear, you need to have a JSR-303 validation provider such as Hibernate Validator (docs here),以便 Spring 可以检测并使用它。

在某些情况下,您似乎还需要 Spring 引导启动程序验证 dependency (spring-boot-starter-validation) on your classpath as well. I would suggest trying that to see if it helps. (Strangely, though, I don't see that detailed in the Spring docs - just briefly mentioned here。)

或者您可以根据 here 实现 Validator 接口,但不确定。