我的REST端点返回ResponseEntity<SomeDto>
或仅返回SomeDto
。因此,我产生了被前端消耗掉的招摇。当然,类型信息SomeDto
是至关重要的。
在我的终结点方法中,我正在做一些基本的检查,以防止异常进一步发生(尽可能快地失败)。
在这种情况下返回ResponseEntity.badRequest().build()
效果很好,但是我想向正文添加错误消息。但是就String
而言,不可能在正文中添加ResponseEntity<SomeDto>
。
问题 我如何在维护签名/合同的同时添加错误消息而又不引发异常(请参见“有效的Java第三版-项目69:仅在特殊情况下使用异常”)?
我看到的一种(错误)方法是向所有dto添加一个错误消息字段(可以由接口指定)。
答案 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
是您所需要的。