当前位置: 首页 > 知识库问答 >
问题:

如何验证Spring Boot Rest响应?

董胡非
2023-03-14

我用Spring Boot Rest实现了控制器:

@RestController
@RequestMapping("/example")
public class ExampleController {

    @Autowired
    private ExampleService exampleService;

    @GetMapping("/{id}")
    public ExampleResponse getExample(@NotNull @PathVariable("id") String id) {
        return exampleService.getExample(id);
    }
}

DTO回应道:

public class ExampleResponse {

    @NotNull
    private String id;

    @NotNull
    private String otherStuff;

    // setters and getters
}

未验证响应正文。我已经用< code>@Valid对其进行了注释,但是< code>null值仍然通过。请求验证工作良好。

如何验证响应正文?

共有3个答案

龚昊然
2023-03-14

您可以添加“@Validated@ResponseBody”注释

public @Validated @ResponseBody getExample(@NotNull @PathVariable("id") String id) {
袁雅逸
2023-03-14

在Rest Controller上使用@Valked,在必须验证返回对象的方法上使用@Valid。例如:

Rest控制器:

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

    @GetMapping("/{taskId}")
    @Valid
    public TaskDTO getTask(@PathVariable UUID taskId) {
        return convertToDto(taskService.findById(taskId));
    }  

}

DTO级:

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

    @FutureOrPresent
    @NotNull
    private ZonedDateTime dueDate;

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

    private String description;

    @NotNull
    private RecurrenceType recurrenceType;

    @Future
    @NotNull
    private ZonedDateTime repeatUntil;

}

我的返回对象TaskDTO具有nulldueDatereupreTot。所以错误消息如下所示:

{
  "timestamp": "2021-01-20T11:09:37.303929",
  "status": 400,
  "error": "Bad Request",
  "message": "getTask.<return value>.dueDate: must not be null, getTask.<return value>.repeatUntil: must not be null",
  "path": null
}

我希望这能有所帮助。有关自定义类级别约束的详细信息,请查看此视频。

何乐
2023-03-14

实现的响应验证器:

@Aspect
@Component
public class ControllerResponseValidator {

    Logger logger = Logger.getLogger(ControllerResponseValidator.class);

    @Autowired
    private Validator validator;

    @AfterReturning(pointcut = "execution(* com.example.controller.*.*(..))", returning = "result")
    public void validateResponse(JoinPoint joinPoint, Object result) {
        validateResponse(result);
    }

    private void validateResponse(Object object) {

        Set<ConstraintViolation<Object>> validationResults = validator.validate(object);

        if (validationResults.size() > 0) {

            StringBuffer sb = new StringBuffer();

            for (ConstraintViolation<Object> error : validationResults) {
                sb.append(error.getPropertyPath()).append(" - ").append(error.getMessage()).append("\n");
            }

            String msg = sb.toString();
            logger.error(msg);
            throw new RestException(HttpStatus.INTERNAL_SERVER_ERROR, msg);
        }
    }
}
 类似资料:
  • 在使用空手道框架进行API测试时,我在验证嵌套JSON响应时遇到了一些问题。 JSON响应: null def feed_cycle={item_type:'#string',title:'#string'} def feed_college_dept_branch={branch:'#string'} def feed_college={item_type:'#string',dept:'[]f

  • 因此,应用程序流程如下: Spring应用程序接收请求- 这是我正在使用的网络客户端(副本): 现在我不想通过控制器将此Mono对象直接返回到客户端(如Angular应用程序),因为这是一个中间步骤。我想对从 WebClient 收到的响应运行一些验证。 我已经试过<代码>。block()方法来检索函数,但是按照反应式编程,这似乎是一种不好的做法。(阻塞操作)此外,我无法理解如何使用<代码>。su

  • OpenAM是否依赖于注册IDP的公钥来使SAML响应多样化 或还取决于来自IDP-like算法的SAML响应中的哈希算法=”http://www.w3.org/2000/09/xmldsig#sha1“” 注意OpenAM版本:13.0.0

  • 放心,当我们这样做时 抛出的错误总是连续的,也就是说,如果状态代码失败,它不会检查contentType是否是JSON。 此外,抛出的错误始终是,断言错误(预期:200,实际:404)。无法从中了解实际响应是什么,如果启用日志记录,它将打印在标准输出上,但其他任何方式都不可用。 是否有任何方法来构建或设置类似于我们如何实现<code>过滤器 我有一个 rest api 框架,其中大多数验证都是使用

  • 我正在使用Springs的Webclient进行HTTP GET调用。 我如何验证响应对象的属性,我收到作为我的HTTP调用的响应。 我试图通过阻止响应对象来验证平板地图中的出生日期,但这看起来不是最有效的方法。 以下是我代码的摘录。 任何帮助都非常感谢。

  • 我有一个与 Rest Assured 中的响应正文验证相关的问题。让我们假设,我有一个像json这样的响应体。 我需要检查: 如果图书部分包含儿童类型 如果一本儿童类书籍的自动名称为Eric 第一个断言可以是这样的: 但是我需要检查它的作者的名字是否是威廉。有没有办法使用jsonPath检查它? 我假设,我可以做反序列化(例如,x. List