@NotNull注解在Spring Boot应用程序中无法正常工作

21

以下是我的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,但它不起作用。它在请求体中被允许,在postman中执行服务后也没有出现任何错误。

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

1)尝试添加maven依赖项。

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

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

3)尝试使用@NotNull注释createdDate字段,但仍然没有运气。

请帮我解决这个问题。


你是否尝试在控制器方法签名中将DTO类注释为@Validated?就像这样:void foo(@Validated MyDTO dto) - Arnaud Denoyelle
@ArnaudDenoyelle 这个DTO已经在多个地方使用了超过25个文件,我需要在每个文件中都进行更改吗?还有其他解决方案吗? - Rahul
你的应用程序是否有starter - spring-boot-starter-web,它将加载hibernate验证器到依赖项中。这将验证bean。请查看此链接 - https://dev59.com/8FYM5IYBdhLWcg3w7jY1?rq=1 - Sujay Mohan
请检查我的答案,它应该解决您的问题。但是如果@NotNull无效而@JsonPattern有效,则可能是使用了错误的@NotNull。否则,您可能忘记在控制器方法上添加@Valid - buræquete
4个回答

17
您的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注释。只有使用这个注释,才能启用/doSomething端点的AbstractDTO验证功能。

更深入的细节请查看此链接


5

你是否引入了正确的库?
我使用了import javax.validation.constraints.NotNull;


3

描述

  1. 在我的情况下,我定义了1个父类A有3个子类B、C、D,如下所示:

public A { private B bCommand; private C cCommand; private D dCommand; }

  1. 我对3个子类中的一些字段进行了@NotNull、@NotBlank注释。在控制器中,我已经对函数进行了如下的@Valid注释:

@PostMapping() public ResponseEntity create(@RequestBody @Valid A
command){ }

解决方案

  1. 我为需要检查约束条件的子类放置了@Valid。
  2. 例如:B类,C类有一些字段具有非空约束条件。

public A { @Valid private B bCommand; @Valid private C cCommand; private D dCommand; }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接