小编典典

在Spring Boot中发送响应的最佳实践

spring-boot

我正在Spring Boot中编写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);
        }
    }

如果请求成功,则响应为 Branch对象* ;如果失败,则响应为仅具有一个属性( message )的
FindError对象
。因此两者能否执行取决于响应。但是摇摇欲坠的UI并未显示应如何显示响应,因为我使用了 “?” 作为 通用类型
。这是捕获错误的最佳实践吗?(此编码文档说明对前端开发人员没有用,因为它没有显示响应对象)。或针对上述问题的最佳做法?
*

有很多方法可以返回不同的对象,例如 Branch 。提前致谢


阅读 333

收藏
2020-05-30

共1个答案

小编典典

首先,您应该遵循RESTful API的最佳实践。不要使用动词,而应使用名词作为URL
@GetMapping("/getOne"),因此您可以将其写为@GetMapping("/branch/{id}")。您可以参考此博客https://blog.mwaysolutions.com/2014/06/05/10-best-
practices-for-better-restful-
api/

@ 2ndly,不返回泛型 吗? ,您可以使用特定的类型(这里为 Branch) 并进行集中异常处理。以下代码段可以帮助您:

@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"
    ]
}
2020-05-30