如何在springboot中优雅地重写控制器

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

我的springboot版本是2.7.0 在maven多模块项目中,我有两个名为A和B的模块,B依赖A。

在模块 A 中,有一个控制器,例如

@Api(tags = "share api")
public interface ShareAPI {

   public void share(ShareDTO dto);

}

@RestController
@RequestMapping("/share")
@ConditionalOnMissingBean(ShareAPI.class)
public class ShareController implements ShareAPI {

  @PutMapping("")
  @Override
  public void share(@RequestBody ShareDTO share){
    // do something
  }

  // ... other methods

}

@Data
public class ShareDTO {
 
   private String url;

}

在模块B中,我想扩展ShareController中share方法的功能:需要在参数中添加一个新的userId字段。

因此我创建了一个新的 DTO 扩展 ShareDTO 并向新的 DTO 添加了一个 userId 字段

@Data
public class ShareAdditionalDTO extends ShareDTO{
 
   private String userId;

}

以及模块 B 中的新控制器:

@RestController
@RequestMapping("/share")
public class ShareAdditionalController extends ShareController {

  @Override
  @PutMapping("/additional")
  public void shareAdditional(@RequestBody ShareAdditionalDTO share){
    // do something
  }

}

已经满足要求了,但是感觉不太优雅:

用户可以访问共享和共享/附加服务,但共享服务实际上已经过时了。现在,我们只需要保留共享/附加服务即可。或者,共享/附加服务不应存在;用户应该仍然可以访问共享服务,但可以选择包含额外的 userId 参数。

那么我怎样才能优雅地做到这一点,尤其是在 Swagger 中,我只想显示一项处于活动状态的服务。 预先感谢

java spring-boot controller
1个回答
0
投票

预计 ShareAdditionalController 还提供

/share
的映射,因为您正在扩展 ShareController,因此它也是
/share
的映射。也许您只想在 ShareADditionalController 中实现 ShareAPI 接口?

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