【问题标题】:How change the http status codes with exception handling如何使用异常处理更改 http 状态码
【发布时间】:2019-07-04 08:28:30
【问题描述】:

我正在尝试将值分配给一个 id 不存在的带有 put 控制器。通常它应该返回 404 但它返回 500。如何转换为 404?我尝试使用 if else 但这不起作用。

@PutMapping("/api/cricketer/{id}")
public ResponseEntity<Cricketer> updateCricketer(@PathVariable("id") Long id, @RequestBody @Valid Cricketer cricketer) {

    Cricketer cCricketer=cricketerService.findById(id);
    cCricketer.setId(id);
    cCricketer.setCountry(cricketer.getCountry());
    cCricketer.setName(cricketer.getName());
    cCricketer.setHighestScore(cricketer.getHighestScore());
    cricketerRepository.save(cCricketer);
    if (cCricketer.getId()!=null){
        return new ResponseEntity<Cricketer>(cCricketer,HttpStatus.OK);
    }
    else {
        return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
    }
}

【问题讨论】:

  • 您的标题包含“异常处理”,但我在您的代码中看不到任何异常处理。你知道异常是如何处理的吗?
  • 你可能会遇到一些异常......检查它是什么,以及你是否需要捕捉它
  • 如果找不到id,它将抛出500,像这样使用try{Cricketer cCricketer=cricketerService.findById(id);}catch(Exception e){ return new ResponseEntity&lt;&gt;(null, HttpStatus.NOT_FOUND);}(不是一个好的解决方案)
  • 我认为你永远不会达到你的else 声明。如果你的cricketerService.findById 在找不到Cricketer 的情况下抛出异常,那么你就不会命中它。如果同样的方法返回null,你会得到一个NullPointerException并且不会命中它。如果它返回 some Cricketer,那么你在下一行代码中设置 id,所以 cCricketer.getId()notnull 并且你不会打它。
  • @Kris:这不是真的...404经常用于表示“找不到资源”,在这种情况下资源是Cricketer

标签: java spring-boot validation http-status-codes


【解决方案1】:

几个选项。


CricketerServicefindById 方法上抛出一个Exception(可能是特定于域的CricketerNotFoundException 或类似的东西),并为此添加一个@ExceptionHandler

@ExceptionHandler(CricketerNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
private void handleCricketerNotFoundException(final CricketerNotFoundException cnfEx) {
    // Log, do anything else...
}

(您也可以在CricketerNotFoundException 类本身上添加@ResponseStatus。)


如果找不到它,让CricketerService.findById 返回null处理这种情况:

public ResponseEntity<Cricketer> updateCricketer(
        @PathVariable("id") Long id, 
        @RequestBody @Valid Cricketer cricketer) {

    @Nullable Cricketer cCricketer=cricketerService.findById(id);

    if (cricketer == null) {
        return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
    }

    cCricketer.setId(id);
    cCricketer.setCountry(cricketer.getCountry());
    cCricketer.setName(cricketer.getName());
    cCricketer.setHighestScore(cricketer.getHighestScore());
    cricketerRepository.save(cCricketer);

    return new ResponseEntity<Cricketer>(cCricketer, HttpStatus.OK);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2019-09-18
    • 2016-11-18
    • 2020-04-04
    • 2020-07-14
    • 2022-06-21
    • 2020-04-15
    相关资源
    最近更新 更多