想象一下这个简单的控制器方法:
public ResponseEntity<?> findById(@Parameter(description = "id") @PathVariable String id) {
Optional<Model> model = repository.findById(id);
if(model.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("Model not found");
}
return ResponseEntity.status(HttpStatus.OK)
.body(model.get());
}
如果找到模型,则返回模型;如果未找到,则返回错误字符串消息。案件可能比这更复杂。
所以我返回一个
String
或 Model
类型,它们无法绑定到 ResponseEntity
的泛型类型。
我的问题是为什么 Spring 团队将此类设计为泛型类型?或者我使用了错误的这个对象?
除其他原因外,
ResponseEntity<T>
还由 Spring 的 RestTemplate
HTTP 客户端返回。泛型类型允许客户端代码指定用于解释 HTTP 响应的类型并获取适当的 Java 对象作为响应主体。
定义 API 时,您定义了操作正常时将返回的对象的类型,这是您应该在响应实体的通用类型中使用的对象。
如果您想返回不同的类型,您可以删除泛型并仅返回 ResponseEntity 并添加您想要的任何对象
让我解释一下为什么spring有通用的responseEntity类型。
在下面的服务类中,我提到返回一个对象(成功时)或字符串作为对象(错误时)。这里是基于输出的响应:
@Service
public class MyService {
public Object myServiceMethod(boolean condition) {
if (condition) {
MyResponseObject responseObject = new MyResponseObject();
// Set properties on responseObject
return responseObject;
} else {
return "Some response string";
}
}
}
我正在控制器类中处理响应:
@RestController
public class MyController {
@Autowired
private MyService myService;
@GetMapping("/my-endpoint")
public ResponseEntity<?> myControllerMethod(@RequestParam boolean condition) {
Object response = myService.myServiceMethod(condition);
if (response instanceof String) {
return ResponseEntity.ok(response);
} else {
return ResponseEntity.ok((MyResponseObject) response);
}
}
}
所以基本上 ResponseEntity 接受所有类型的值。