Java 在Spring引导中处理无效的PathVariable

Java 在Spring引导中处理无效的PathVariable,java,spring,spring-boot,rest,Java,Spring,Spring Boot,Rest,假设我有一个GET controller/api/product/{id},其中id是一个整数。处理具有非整数ID的请求的最佳方法是什么?此时Spring只是抛出一个java.lang.NumberFormatException并返回一个400。您可以进行路径变量验证,假设id应该是正的int值 @GetMapping("/api/product/{id}") public void getProduct(@PathVariable("id") @Min(value = 0) Integer i

假设我有一个GET controller/api/product/{id},其中id是一个整数。处理具有非整数ID的请求的最佳方法是什么?此时Spring只是抛出一个java.lang.NumberFormatException并返回一个400。

您可以进行路径变量验证,假设id应该是正的int值

@GetMapping("/api/product/{id}")
public void getProduct(@PathVariable("id") @Min(value = 0) Integer id) {
    // ...
}
阅读以上请求验证的更多内容


如果您知道产品id有一些int值范围,您甚至可以尝试
@Range

如果您声明
id
是整数,则400响应似乎是合适的

如果您反对Spring处理它,那么您可以始终将path变量设置为字符串,自己检查数字,然后默默地返回400或任何其他您想要的响应

@GetMapping("/api/product/{id}")
public ResponseEntity<Product> getProduct(@PathVariable("id") String s) {
    try {
       int id = Integer.parseInt(s);
       // valid integer id here, do normal work ...
    }
    catch(NumberFormatException nfe) {
       return ResponseEntity.status(400).build(); // or whatever error code you want
    }
}
@GetMapping(“/api/product/{id}”)
公共响应属性getProduct(@PathVariable(“id”)字符串s){
试一试{
int id=Integer.parseInt(s);
//此处为有效整数id,请执行正常工作。。。
}
捕获(NumberFormatException nfe){
返回ResponseEntity.status(400.build();//或任何需要的错误代码
}
}
假设我有一个GET controller/api/product/{id},其中id是一个整数。处理具有非整数ID的请求的最佳方法是什么

如果
/api/product/abcde
是一个没有当前表示形式的资源,那么您可能应该在消息体中返回a,with

状态代码是元数据,状态代码的目标受众是理解“通过网络传输文档”域的通用组件。在这里,您希望提请注意目标uri的拼写,404是适当的方法

可能是404的合理替代品

404状态代码并不表明这种缺乏代表性是暂时的还是永久的;如果源服务器可能通过一些可配置的方式知道状态可能是永久性的,那么410(Gone)状态代码优先于404

410响应主要用于通过通知接收者资源故意不可用以及服务器所有者希望删除指向该资源的远程链接来协助web维护任务。此类活动在有限的时间、促销服务和不再与源服务器站点关联的个人资源中很常见。无需将所有永久不可用的资源标记为“已消失”,也无需将标记保留任何时间长度——这由服务器所有者自行决定


请注意,
404
410
都是“默认可缓存的”,这可能是您在这种情况下想要的。

您不喜欢这种方法的什么?400是正确的,因为这是一个错误的请求。您的要求是什么?这是一个错误请求的情况,如果您希望以更通用的级别处理各种异常情况,请参见: