SpringBoot将错误消息添加到rest响应,但不引发异常,但保留键入的响应

SpringBoot将错误消息添加到rest响应,但不引发异常,但保留键入的响应,rest,spring-boot,Rest,Spring Boot,我的REST端点返回ResponseEntity或只返回SomeDto。在这一点上,我产生了一个招摇过市的前端消费。当然,类型信息SomeDto是至关重要的 在我的端点方法中,我正在做一些基本的检查,以防止进一步出现异常(尽可能快地失败) 在这种情况下,返回ResponseEntity.badRequest().build()可以正常工作,但我想在正文中添加一条错误消息。但是在响应性方面,向正文添加字符串是不可能的 问题 如何在维护签名/合同时添加错误消息,而无需引发异常(请参阅“有效Java第

我的REST端点返回
ResponseEntity
或只返回
SomeDto
。在这一点上,我产生了一个招摇过市的前端消费。当然,类型信息
SomeDto
是至关重要的

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

在这种情况下,返回
ResponseEntity.badRequest().build()
可以正常工作,但我想在正文中添加一条错误消息。但是在
响应性方面,向正文添加
字符串
是不可能的

问题 如何在维护签名/合同时添加错误消息,而无需引发异常(请参阅“有效Java第三版-“第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);
    }
静态抽象类ApiResponse{
枚举状态{
成功,,
失败,
}
@吸气剂
@塞特
私人身份;
@吸气剂
@塞特
私有字符串错误消息;
}
类namedto扩展ApiResponse{
@塞特
@吸气剂
字符串[]名称;
}
@GetMapping(value=“namedto”)
公共响应性getNames(){
final namedto namedto=新namedto();
namedto.setStatus(ApiResponse.Status.FAILURE);
namedto.names=新字符串[]{“john”,“doe”};
返回ResponseEntity.ok(namedTo);
}
@GetMapping(value=“errordto”)
公众反应错误(){
final namedto namedto=新namedto();
namedto.setErrorMessage(“未找到名称”);
namedto.setStatus(ApiResponse.Status.FAILURE);
返回ResponseEntity.ok(namedTo);
}

@Getter/@Setter
是从
import lombok.*
package

导入的,使用
ResponseEntity.badRequest().body(xxx).build()
或抛出异常都可以,只要契约相同


您正在使用lib生成一个招摇过市的文档(例如Springfox)?嗯,它在某些情况下很好,但不能创造奇迹。文档生成不应该影响您编写代码的方式。在这种情况下,
@ApiResponse
就是您所需要的。

我已经添加了答案,请看一看!可能是面向方面的编程?使用反射在运行时拦截方法调用并更改body?:d“ResponseEntity.badRequest().body(xxx).build()”的问题是“xxx”不是同一类型的DTO。它是一个字符串(我想输入一条错误消息)。在这种情况下,您应该返回
ResponseEntity
。这与我看到的一种方式类似。问题是,消费者必须知道“apiResponse”“知道如何处理错误。我希望消费者只需要通过状态代码进行处理,如果出现错误代码(!=2xx),它可以使用错误消息。可以基于ApiResponseStatus转储json中的相同响应