我有以下控制器:
@PostMapping("/product/{id}")
void getProduct (@PathVariable UUID productId);
和id
是我的数据库表中的id。我的ORM是Hibernate。如果最好的方式没有这样的NOT_FOUND
,如何返回id
?
我知道我可以:
void getProduct(@PathVariable UUID productId){
// check whether exists a file and throw NOT_FOUND if not.
}
我正在寻找更好的方法 - 这是我项目中非常常见的情况。
答案 0 :(得分:1)
对您而言,一个非常常见且有效的模式是服务层将未找到数据库的案例委托给特定于应用程序的异常,然后控制器顾问程序将异常转换处理为有意义的休息响应。 This是一篇旧文章@ spring.io,它将为您提供更多建议。
服务bean:
@Service
class ResourceService {
@Autowired
ResourceDao dao;
Resource getById(UUID id) {
Resource res = dao.findById(id);
if (res != null) {
throw new MyNotFoundException();
}
return res;
}
}
顾问bean:
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = MyNotFoundException.class)
protected ResponseEntity<Object> handleConflict(MyNotFoundException ex, WebRequest request) {
String bodyOfResponse = "No resource with this id found.";
return handleExceptionInternal(ex, bodyOfResponse,
new HttpHeaders(), HttpStatus.NOT_FOUND, request);
}
}