RequestBody Dto的Spring Boot验证在Rest API中注释

时间:2018-01-22 15:46:37

标签: spring spring-boot

在我的控制器中,我使用@Valid注释注释了request参数,并使用@NotNull注释注释了我的DTO字段,但验证似乎不起作用。

是否有任何配置要进行验证?以下是Controller和DTO课程的详细信息。

@RepositoryRestController
@RequestMapping(value = "/download_pdf")
public class PurchaseController {

    @Autowired
    private IPurchaseService iPurchaseService;

    @Loggable
    @RequestMapping(value = "view_order", method = RequestMethod.POST)
    public ResponseEntity getPDF(@RequestBody @Valid CustomerOfferDto offer,
                                 HttpServletResponse response) {
        return iPurchaseService.purchase(offer, response);
    }
}

public class CustomerOfferDto {
    @NotNull
    private String agentCode;

    // getter and setter...

 }

2 个答案:

答案 0 :(得分:1)

在我的项目中,这通常发生在我将代码从说Entity更改为DTO而忘记将@ModelAttribute添加到我的DTO参数中时。

如果您也遇到这种情况,请尝试将@ModelAttribute("offer")添加到您的DTO参数中。

答案 1 :(得分:0)

以下是我为使其工作所做的步骤。

添加依赖:

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

DTO 类中的约束:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ValidTaskDTO
public class TaskDTO {

    @FutureOrPresent
    @NotNull(message = "DueDate must not be null")
    private ZonedDateTime dueDate;

    @NotBlank(message = "Title cannot be null or blank")
    private String title;

    private String description;

    @NotNull
    private RecurrenceType recurrenceType;

    @Future
    @NotNull(message = "RepeatUntil date must not be null")
    private ZonedDateTime repeatUntil;

}

在 requestBody 参数上带有 @Valid 注释的 RestController 方法

@RestController
@RequestMapping("/tasks")
@Validated
public class TaskController {

    @PostMapping
    public TaskDTO createTask(@Valid @RequestBody TaskDTO taskDTO) {
      .....
    }

}

在使用包含 POSTnull 值的 requestbody 发出 dueDate 请求时,我收到了如下所示的预期错误消息。

{
  "timestamp": "2021-01-20T11:38:53.043232",
  "status": 400,
  "error": "Bad Request",
  "message": "DueDate must not be null"
}

我希望这会有所帮助。有关类级别约束的详细信息,请查看 this video