Spring Boot将错误消息添加到REST响应中,而无需抛出异常,但请保留键入响应



我的休息端点返回ResponseEntity<SomeDto>或仅SomeDto。出于此,我会产生招摇,而前端消耗。当然,类型信息SomeDto至关重要。

在我的端点方法中,我正在进行一些基本检查以防止路上进一步的例外(尽可能快地失败(。

在这种情况下返回ResponseEntity.badRequest().build()的工作正常,但是我想向身体添加错误消息。但是在ResponseEntity<SomeDto>中不可能向身体添加String

问题在保持签名/合同的同时,我如何添加错误消息,而无需提高例外(请参阅"有效的Java 3rd Edition-"项目69:仅在特殊情况下使用异常"(?

我看到的一种(不良(方法是将错误消息字段添加到我所有的DTO(可以由接口指定(。

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

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.*软件包导入的

使用ResponseEntity.badRequest().body(xxx).build()或抛出异常是可以的,一旦合同相同。

您正在使用lib生成宣传文档(例如springfox(?好吧,在某些情况下确实可以,但无法执行奇迹。文档生成不应影响您编写代码的方式。在这种情况下,您需要@ApiResponse

最新更新