SpringBoot 2.7.0多模块下优雅覆写Controller的方案咨询
方案二:兼容原/share接口,支持可选传入userId
这种方案保留原接口路径,用户可选择是否传入userId参数,无需修改接口地址。
1. 用子类DTO接收参数
ShareAdditionalDTO继承自ShareDTO,Spring MVC会自动兼容两种请求格式:仅传url,或同时传url和userId。
2. 覆盖原Controller的方法
在模块B编写继承自ShareController的新Controller,覆盖原share方法,用ShareAdditionalDTO作为参数:
@RestController @RequestMapping("/share") public class ShareAdditionalController extends ShareController { @Override @PutMapping("") @ApiOperation("支持可选userId的分享接口") public void share(@RequestBody ShareAdditionalDTO share) { // 扩展逻辑:userId不为空时处理额外逻辑 if (share.getUserId() != null) { // 新增的userId相关处理 } // 复用或重写原业务逻辑 } }
3. 标记userId为可选参数
在ShareAdditionalDTO的字段上添加Swagger注解,明确标记为可选:
@Data public class ShareAdditionalDTO extends ShareDTO{ @ApiParam(value = "用户ID(可选)", required = false) private String userId; }
4. 避免重复加载原Controller(可选)
为防止模块A的ShareController被实例化导致Swagger展示重复接口,修改模块A的ShareController注解:
@RestController @RequestMapping("/share") @ConditionalOnMissingBean({ShareAPI.class, ShareAdditionalController.class}) public class ShareController implements ShareAPI { // ... 原有代码 }
内容的提问来源于stack exchange,提问作者linxiao yu
相关产品推荐
相关产品推荐

