Java Spring GetMapping注释异常

Java Spring GetMapping注释异常,java,spring,Java,Spring,控制器类中有以下方法: @GetMapping("{id:" + REGEXP + "}") @ResponseBody public SomeObject getById(@PathVariable UUID id) { return someObjectService.getById(id)); } REGEXP是一个简单的正则表达式字符串。在someObjectService中,getById方法处理id找不到对象并引发异常的情况。对于此类

控制器类中有以下方法:

    @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 occurrens,但是错误的json主体是默认的(引导),它没有
CustomErrorResponse
结构


问题是:当
@GetMapping(“{id:“+REGEXP+”}”)
中的id没有通过REGEXP检查时,会引发什么样的异常,以及在哪里(为了进一步适当的处理)?

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

请查看此页面,了解如何设计REST端点:

关于您的问题-在这种情况下,您不能使用验证。您需要为此字段添加自定义验证器 请在此处找到“自定义验证器”部分:
为什么要在get映射中发布json? 在这种情况下,您需要使用localhost:8080/yourApp/entity/{id:10} 这真的是你需要的而不是localhost:8080/yourApp/entity/10吗

请查看此页面,了解如何设计REST端点:

关于您的问题-在这种情况下,您不能使用验证。您需要为此字段添加自定义验证器 请在此处找到“自定义验证器”部分:

如果您想创建正则表达式来检查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类型上工作,所以您必须手动将字符串转换为UUID


如果您想创建正则表达式来检查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类型上工作,所以您必须手动将字符串转换为UUID

您可以在中阅读有关验证的更多信息