控制器类中有以下方法:
@GetMapping("{id:" + REGEXP + "}")
@ResponseBody
public SomeObject getById(@PathVariable UUID id) {
return someObjectService.getById(id));
}
REGEXP是一个简单的正则表达式字符串。在someObjectService中,getById方法处理无法通过id找到对象并引发异常的情况。对于此类情况,还有异常处理程序类可自定义错误响应:
@ExceptionHandler({ResourceNotFoundException.class})
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
public CustomErrorResponse handleNotFoundCase (ResourceNotFoundException exception) {
CustomErrorResponse customerErrorResponse = new CustomErrorResponse();
// filling CustomErrorResponse with specific data using 'exception'
return customerErrorResponse;
}
因此,当我使用不存在的id测试getById
并通过REGEXP检查时,预期结果=已实现结果:404和错误的json主体具有CustomErrorResponse
的结构(来自处理程序)。
但是,当我对id进行同样的操作时,它不通过REGEXP检查-404发生,但错误的json正文为默认值(引导程序),它没有CustomErrorResponse
结构。
问题是:当@GetMapping("{id:" + REGEXP + "}")
中的id未通过正则表达式检查时,会引发什么类型的异常?在哪里(进一步处理)?
答案 0 :(得分:1)
为什么要尝试在获取映射中发布json? 在这种情况下,您需要使用localhost:8080 / yourApp / entity / {id:10}
而不是localhost:8080 / yourApp / entity / 10,实际上是您需要的吗?请查看此页面,了解如何设计REST端点: https://git.heroku.com/enigm
关于您的问题-在这种情况下,您不能使用验证。您需要为此字段添加自定义验证器 请在此处找到“自定义验证器”部分: https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design
答案 1 :(得分:1)
如果您要创建正则表达式来检查uuid是否正确,则不必这样做,并且
Error in click: NoSuchElementError: No element found using locator:
将验证这一点。
另一方面,如果您对此的要求比使用模式验证器的要求更严格:
@GetMapping("/{id}")
public SomeObject getById(@PathVariable UUID id) {
请注意,模式验证器不适用于UUID类型,因此您必须手动将String转换为UUID。
您可以在https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/validation.html
中了解有关验证的更多信息