【发布时间】:2021-09-07 22:01:55
【问题描述】:
我是 spring 新手,我正在尝试找出全局异常处理。我在这里想要实现的是,当使用不存在的主键发出请求时,我想返回一个 HTTP_NO_CONTENT,其正文包括时间戳和所述请求的给定 ID。
这是我的控制器建议
@ControllerAdvice
public class ControllerAdvisor {
@ExceptionHandler(NoLevelFoundException.class)
public ResponseEntity<ResponseBody> handleNoLevelFoundException( NoLevelFoundException ex) {
ex.printStackTrace();
ResponseBody error = new ResponseBody();
error.setTime(Timestamp.from(Instant.now()));
error.setMessage(ex.getMessage());
return new ResponseEntity<>(error, HttpStatus.NO_CONTENT);
}
}
这些是我的自定义异常和响应体
public class NoLevelFoundException extends RuntimeException{
public NoLevelFoundException(int id) {
super("No level with id " + id + " found!");
}
}
public class ResponseBody {
private Timestamp time;
private String message;
...
}
return ResponseEntity.noContent().build(); 我仍然得到正确的状态码,但我找不到任何添加正文的方法。
我也试过这段代码
ResponseBody error = new ResponseBody();
error.setTime(Timestamp.from(Instant.now()));
error.setMessage(ex.getMessage());
return ResponseEntity.status(HttpStatus.NO_CONTENT).body(error);
使用这种样式,我明确添加了正文,但结果仍然相同。正确的 HTTP 状态,但正文为空。
#编辑
这就是我首先抛出错误的方式
第一个请求被 RestContorller 捕获
@RestController
@RequestMapping("/levels")
public class LevelRestApi {
private ServiceLayer service;
@Autowired
public LevelRestApi(ServiceLayer service, LevelRepository repo) {
this.service = service;
}
@GetMapping("/{stage}")
public Level getLevel(@PathVariable int stage){
return service.getLevel(stage);
}
}
调用服务层检查项目是否存在。我在这里抛出错误。
@Service
public class AlienInvadersServiceLayer implements ServiceLayer {
JpaRepository levelRepository;
@Autowired
public AlienInvadersServiceLayer(@Qualifier(value = "levelRepository") JpaRepository levelRepository) {
this.levelRepository = levelRepository;
}
@Override
public Level getLevel(int levelId) {
Optional<Level> result = levelRepository.findById(levelId);
if (result.isPresent()){
return result.get();
}
else {
throw new NoLevelFoundException(levelId);
}
}
}
【问题讨论】:
-
您需要使用
NoLevelFoundException在您希望@ControllerAdvice处理错误的地方抛出执行。分享你处理过的代码unexisting item -
或者使用
@RestControllerAdvice而不是@ControllerAdvice -
我都试过了,但都没有。
标签: java spring-boot exception httprequest