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