Я кодирую REST Api-s в весенней загрузке. Я хочу убедиться, что мой код читается интерфейсными разработчиками, использующими инструмент разработки swagger API (swagger). Например
@GetMapping("/getOne")
public ResponseEntity<?> getOne(@RequestParam String id) {
try {
return new ResponseEntity<Branch>(branchService.getOne(id), HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<FindError>(new FindError(e.getMessage()), HttpStatus.BAD_REQUEST);
}
}
Если запрос выполнен успешно, ответ представляет собой Филиальный объект, в случае неудачи ответ представляет собой Объект FindError, который имеет только один атрибут (сообщение). Таким образом, оба могут быть выполнены в зависимости от ответа. Но пользовательский интерфейс swagger не показывает, как должен отображаться ответ, потому что я использую "?" как универсальный тип. Является ли это лучшей практикой, чтобы поймать ошибку? (Это swagger документации по кодированию бесполезно для разработчиков интерфейса, поскольку оно не показывает объект ответа). Или любая лучшая практика для вышеуказанной проблемы?
Существует множество методов, которые возвращают разные объекты, такие как Ветвь.. заранее спасибо
Контроллеры @varman не должны возвращать неоднозначные типы. Это создает много проблем во внешнем интерфейсе и обычно считается плохим дизайном. Вы должны изучить ResponseEntityExceptionHandler для обработки ответов об ошибках.
Я бы порекомендовал сделать это так.
@GetMapping("/getOne")
public Response getOne(@RequestParam String id) {
ResponseEntity<Branch> resbranch;
ResponseEntity<FindError> reserror;
try {
resbranch=new ResponseEntity<Branch>(branchService.getOne(id), HttpStatus.OK);
return Response.status(200).entity(resbranch).build();
} catch (Exception e) {
reserror=new ResponseEntity<FindError>(new FindError(e.getMessage()), HttpStatus.BAD_REQUEST);
return Response.status(400).entity(reserror).build();
}
}
200 — нормально, 400 — плохой запрос. Здесь больше не будет неоднозначных типов.
Прежде всего, вы должны следовать лучшим практикам RESTful API. Не используйте глаголы, вместо этого используйте существительные в качестве URL-адреса. Таким образом, вместо @GetMapping("/getOne") вы можете написать
это как @GetMapping("/branch/{id}") .
Вы можете сослаться на этот блог https://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/
@ Во-вторых, не возвращайте общий тип как ?, вместо этого вы можете использовать конкретный тип, здесь как Ветвь, и выполнять централизованную обработку исключений. Следующий фрагмент кода может вам помочь:
@GetMapping("/branch/{id}")
public ResponseEntity<Branch> getBranch(@Pathvariable String id) {
{
Branch branch = branchService.getOne(id);
if (branch == null) {
throw new RecordNotFoundException("Invalid Branch id : " + id);
}
return new ResponseEntity<Branch>(branch, HttpStatus.OK);
}
RecordNotFoundException.java
@ResponseStatus(HttpStatus.NOT_FOUND)
public class RecordNotFoundException extends RuntimeException
{
public RecordNotFoundException(String exception) {
super(exception);
}
}
CustomExceptionHandler.java
@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler
{
@ExceptionHandler(Exception.class)
public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
List<String> details = new ArrayList<>();
details.add(ex.getLocalizedMessage());
ErrorResponse error = new ErrorResponse("Server Error", details);
return new ResponseEntity(error, HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(RecordNotFoundException.class)
public final ResponseEntity<Object> handleRecordNotFoundException(RecordNotFoundException ex, WebRequest request) {
List<String> details = new ArrayList<>();
details.add(ex.getLocalizedMessage());
ErrorResponse error = new ErrorResponse("Record Not Found", details);
return new ResponseEntity(error, HttpStatus.NOT_FOUND);
}
}
ErrorResponse.java
public class ErrorResponse
{
public ErrorResponse(String message, List<String> details) {
super();
this.message = message;
this.details = details;
}
private String message;
private List<String> details;
//Getter and setters
}
Приведенный выше класс обрабатывает несколько исключений, включая RecordNotFoundException, и вы также можете настроить проверку полезной нагрузки.
Тестовые примеры:
1) HTTP GET /branch/1 [VALID]
HTTP Status : 200
{
"id": 1,
"name": "Branch 1",
...
}
2) HTTP GET /branch/23 [INVALID]
HTTP Status : 404
{
"message": "Record Not Found",
"details": [
"Invalid Branch id : 23"
]
}
спасибо, но если я получу какие-либо другие ошибки, справится ли с этим Exception.class? Например: проверка гибернации...
Да справится.
Это ужасный дизайн, используйте правильный код ответа http, чтобы указать условия ошибки.