@NotNull 注释在 Spring boot 应用程序中不起作用

问题描述 投票:0回答:5

下面是我的DTO课程。

public class AbstractDTO extends BaseDTO {

    private Integer createdBy;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_FORMAT)
    @NotNull(message = "createdDate may not be null")
    private LocalDateTime createdDate;

    private Integer lastModifiedBy;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_FORMAT)
    private LocalDateTime lastModifiedDate;

    private Boolean isActive;

    // getter & setters
}

这里我尝试将createdDate字段注释为@NotNull,但它不起作用。它允许在请求正文中以及在邮递员中执行服务后不会收到任何错误。

我尝试过以下选项,但没有成功。

1)尝试添加maven依赖。

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

2)尝试将DTO类注释为@Validated

3)尝试用@NotNull注释createdDate字段@Valid但仍然不走运。

请帮我解决这个问题。

java spring spring-boot spring-mvc
5个回答
20
投票

您的 DTO 类是正确的。您必须使用

@Valid
注释。

例如:

@Controller
public class Controller {

    @PostMapping("/")
    public String checkPersonInfo(@Valid AbstractDTO abstractDTO, BindingResult bindingResult) {

        if (bindingResult.hasErrors()) {
            return "some-page";
        }
        return "some-other-page";
    }
}

请参阅此 Spring Boot 验证表单输入的示例 以供参考。

为什么要使用

@Valid
注释?

这允许您验证应用于类的数据成员的约束集。


但是,如果您的项目中有基于 XML 的配置,则必须将其添加到下面给出的 applicationContext.xml 中。 (来源:这里

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean
            class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="validator" ref="validator" />
        </bean>
    </property>
</bean> 

    <bean id="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    </bean>

9
投票

您有一个带有一些请求正文的端点,例如;

@RestController
public class TheController {

    @PostMapping(path = "/doSomething", consumes = "application/json", produces = "application/json")
    public void post(@Valid @RequestBody AbstractDTO request) {
        //code
    }
}

您需要为请求对象添加

@Valid
注释。只有这样,您才能为
AbstractDTO
端点启用验证。

查看

此处

,了解更多详细信息


6
投票
我用

/doSomething

    


3
投票
描述

在我的例子中,我定义1个父类A有3个子类B、C、D,例如:
public A { private B bCommand; 私有 C cCommand; 私人D d命令; }

我为3个子类中的一些字段注释了@NotNull,@NotBlank。 在控制器中,我为这样的函数添加了@Valid:
@PostMapping() public ResponseEntity create(@RequestBody @Valid A
命令){ }


解决方案

我为具有需要检查约束的字段的子类添加了@Valid。
  1. 示例: B、C 类有一些字段具有非空等约束
public A { @Valid private B bCommand; @Valid private C cCommand; 私有D dCommand; }


0
投票

错误导入:导入 Javax.validation.constraints.NotNull;

而不是,

正确导入:import Jakarta.validation.constraints.NotNull;

© www.soinside.com 2019 - 2024. All rights reserved.