【问题标题】:Javax validation not working on boot rest controller parameterJavax 验证不适用于引导休息控制器参数
【发布时间】:2020-12-27 19:10:01
【问题描述】:

我在 Spring Boot 应用程序中有一个 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>

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

【问题讨论】:

  • 不确定它是否会有所帮助,但我到目前为止看到的@Valid 的用法就像@Valid @RequestBody MyPojo pojo 而不是@RequestBody @Valid MyPojo pojo。你可以试试这个吗?
  • 如果你应用@Damodar Hegde 的建议,那么我有相同的配置,它对我有用。我只想删除 lombok 注释,尤其是这个实验性的。然后在我的情况下它工作得很好

标签: spring spring-boot lombok


【解决方案1】:

您应该尝试将 Spring 的 @Validated 注解添加到类级别的控制器中,以告诉 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注解可以在类级别和方法或参数级别应用。

【讨论】:

    【解决方案2】:

    根据documentation,这并不完全清楚,您需要在您的类路径上有一个 JSR-303 验证提供程序,例如 Hibernate Validator(文档here),以便 Spring 可以检测和使用它。

    在某些情况下,您似乎还需要在您的类路径上使用 Spring Boot Starter Validation dependency (spring-boot-starter-validation)。我建议尝试一下,看看是否有帮助。 (奇怪的是,我在 Spring 文档中没有看到详细信息 - 只是简单地提到了 here。)

    或者您可以按照here 实现验证器接口,但不确定。

    【讨论】:

    • 好吧,文档不清楚。它只使用spring-boot-starter-validation
    猜你喜欢
    • 1970-01-01
    • 2020-09-25
    • 2018-01-17
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多