如何处理Controller返回原生ResponseEntity的Raw types usage警告
问题描述
编写了两个用于触发工作流记录操作的POST接口,执行完对应服务逻辑后统一返回200成功响应,原始实现代码如下:
/** * Initiate some workflow. * * @param recordsBulkInitiate records to initiate * @return {@link ResponseEntity} */ @ApiOperation(value = "initiate workflow") @PostMapping("/initiate") public ResponseEntity bulkInitiateRecords(@RequestBody InitiateBulkRecordsDto recordsBulkInitiate) { workflowService.bulkInitiate(recordsBulkInitiate); return ResponseEntity.ok(OK); } /** * Submit some workflow action on arecord * * @param workflowActionDto the record action data * @return {@link ResponseEntity} */ @ApiOperation(value = "action taken by user") @PostMapping("/action") public ResponseEntity submitAction(@RequestBody WorkflowActionDto workflowActionDto) { log.info("submit action on record [{}]", workflowActionDto); workflowService.submitRecordAction(workflowActionDto); return ResponseEntity.ok(OK); }
上述代码在SonarLint、IntelliJ IDEA中会触发*Raw types should not be used(不应使用原始类型)*警告。临时使用ResponseEntity<Object>的写法可以规避警告,但语义不规范,属于临时兼容方案,需要符合编码规范的正确处理方式。
规范处理方案
根据接口实际返回逻辑选择对应泛型类型即可,不需要用Object这种模糊的泛型声明:
- 接口不需要返回自定义业务响应体,仅返回200状态码时,使用
ResponseEntity<Void>作为返回类型Void是Java中专门用于标识无返回值的引用类型,完全满足泛型校验规则,方法签名可以清晰告知调用方该接口无有效响应体,不存在语义歧义。
修改后的代码示例:
提示:如果业务允许返回204无内容状态码,也可以直接写/** * Initiate some workflow. * * @param recordsBulkInitiate records to initiate * @return {@link ResponseEntity} */ @ApiOperation(value = "initiate workflow") @PostMapping("/initiate") public ResponseEntity<Void> bulkInitiateRecords(@RequestBody InitiateBulkRecordsDto recordsBulkInitiate) { workflowService.bulkInitiate(recordsBulkInitiate); // 无响应体场景用build()构造空body的ok响应即可 return ResponseEntity.ok().build(); } /** * Submit some workflow action on arecord * * @param workflowActionDto the record action data * @return {@link ResponseEntity} */ @ApiOperation(value = "action taken by user") @PostMapping("/action") public ResponseEntity<Void> submitAction(@RequestBody WorkflowActionDto workflowActionDto) { log.info("submit action on record [{}]", workflowActionDto); workflowService.submitRecordAction(workflowActionDto); return ResponseEntity.ok().build(); }return ResponseEntity.noContent().build();,语义更精准。 - 接口需要返回固定结构的通用成功响应(比如包含code、message字段的统一返回包装类)时,直接将通用响应类作为泛型参数
比如项目中定义了统一响应类ApiResponse,常量OK为ApiResponse类型的成功实例,直接将返回值声明为ResponseEntity<ApiResponse>即可,既符合泛型规范,也能清晰告知调用方响应体结构。
为什么不推荐
ResponseEntity<Object> ResponseEntity<Object>虽然能绕过静态检查的原始类型警告,但语义上表示响应体可以是任意Java对象,和接口实际的返回逻辑完全不匹配,后续维护人员无法从方法签名判断接口响应格式,会增加不必要的维护成本。
内容的提问来源于stack exchange,提问作者saran3h
相关产品推荐
相关产品推荐

