为什么 ResponseEntity<T> 是通用的?

问题描述 投票:0回答:3

想象一下这个简单的控制器方法:

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 团队将此类设计为泛型类型?或者我使用了错误的这个对象?

java spring spring-boot spring-restcontroller spring-rest
3个回答
1
投票

除其他原因外,

ResponseEntity<T>
还由 Spring 的 RestTemplate
 HTTP 客户端
返回
。泛型类型允许客户端代码指定用于解释 HTTP 响应的类型并获取适当的 Java 对象作为响应主体。


1
投票

定义 API 时,您定义了操作正常时将返回的对象的类型,这是您应该在响应实体的通用类型中使用的对象。

如果您想返回不同的类型,您可以删除泛型并仅返回 ResponseEntity 并添加您想要的任何对象


0
投票

让我解释一下为什么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 接受所有类型的值。

© www.soinside.com 2019 - 2024. All rights reserved.