繁体   English   中英

Spring GetMapping注释异常

[英]Spring GetMapping annotation exception

控制器类中有以下方法:

    @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主体为默认值(bootstrap),它没有CustomErrorResponse结构。

问题是:当@GetMapping("{id:" + REGEXP + "}")中的@GetMapping("{id:" + REGEXP + "}")未通过正则表达式检查时,会引发什么类型的异常?在哪里(进行进一步的适当处理)?

为什么要尝试在您的get映射中发布json? 在这种情况下,您将需要使用localhost:8080 / yourApp / entity / {id:10}而不是localhost:8080 / yourApp / entity / 10实际需要的吗?

请查看此页面,了解如何设计REST端点: https : //docs.microsoft.com/en-us/azure/architecture/best-practices/api-design

关于您的问题-在这种情况下,您不能使用验证。 您需要为此字段添加自定义验证器。请在此处找到“自定义验证器”部分: https : //www.mkyong.com/spring-boot/spring-rest-validation-example/

如果要创建正则表达式以检查uuid是否正确,则不需要这样做,并且

@GetMapping("/{id}")
public SomeObject getById(@PathVariable UUID id) {

将验证这一点。

另一方面,如果您对此有更严格的要求,而不是需要使用模式验证器:

@RestController
@Validated
public class Ctrl {
    // ...
    @GetMapping("/{id}")
    public String getById(@Pattern(regexp = REGEXP) @PathVariable String id) {
        return someObjectService.getById(UUID.fromString(id)));
    }

}

请注意,模式验证器不适用于UUID类型,因此您必须手动将String转换为UUID。

您可以在https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/validation.html中阅读有关验证的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM