Spring Boot添加错误消息以休息响应而不抛出异常但保持键入的响应

时间:2019-05-07 09:44:47

标签: rest spring-boot

我的REST端点返回ResponseEntity<SomeDto>或仅返回SomeDto。因此,我产生了被前端消耗掉的招摇。当然,类型信息SomeDto是至关重要的。

在我的终结点方法中,我正在做一些基本的检查,以防止异常进一步发生(尽可能快地失败)。

在这种情况下返回ResponseEntity.badRequest().build()效果很好,但是我想向正文添加错误消息。但是就String而言,不可能在正文中添加ResponseEntity<SomeDto>

问题 我如何在维护签名/合同的同时添加错误消息而又不引发异常(请参见“有效的Java第三版-项目69:仅在特殊情况下使用异常”)?

我看到的一种(错误)方法是向所有dto添加一个错误消息字段(可以由接口指定)。

2 个答案:

答案 0 :(得分:1)

您不需要向单个对象添加错误模型,而是从定义了错误定义的基类扩展响应模型,这就是我将如何实现它。

static abstract class ApiResponse {
        enum Status {
            SUCCESS,
            FAILURE,
        }

        @Getter
        @Setter

        private Status status;
        @Getter
        @Setter
        private String errorMessage;

    }

    class NamesDto extends ApiResponse {
        @Setter
        @Getter
        String[] names;
    }

    @GetMapping(value = "namesdto")
    public ResponseEntity<ApiResponse> getNames() {
        final NamesDto namesDto = new NamesDto();
        namesDto.setStatus(ApiResponse.Status.FAILURE);
        namesDto.names = new String[]{"john", "doe"};
        return ResponseEntity.ok(namesDto);
    }


    @GetMapping(value = "errordto")
    public ResponseEntity<ApiResponse> erroDto() {
        final NamesDto namesDto = new NamesDto();
        namesDto.setErrorMessage("No names found");
        namesDto.setStatus(ApiResponse.Status.FAILURE);
        return ResponseEntity.ok(namesDto);
    }

@Getter/@Setter是从import lombok.*

导入的

答案 1 :(得分:1)

只要合同相同,使用ResponseEntity.badRequest().body(xxx).build()或引发异常都可以。

您使用的是库来生成Swagger Doc(例如Springfox)吗?好吧,它在某些情况下还不错,但是却不能创造奇迹。文档的生成不应影响您编写代码的方式。在这种情况下,@ApiResponse是您所需要的。