仅针对 Springdoc 将 @PathVariable 对象替换为 ID

Replace @PathVariable object with ID only for Springdoc

我目前正在尝试从 Springfox 迁移到 Springdoc。

我的大多数端点都包含 @PathVariable Instance。显然我只传递了实例的 ID,Spring 会自动为我解析对象。

这是一个例子:

@RestController
@RequestMapping(value = "/api/{instance}/role")
public class RoleController {

  @GetMapping()
  public ResponseEntity<?> getRoles(@PathVariable Instance instance) {
    return ResponseEntity.ok().build();
  }
  
}

称为/api/myInstance/role

Springfox 会为我正确处理这个问题,只会生成 {instance} 作为 String 映射到 Instance 的 ID。但是,Springdoc 期望整个对象作为路径参数传递。

到目前为止我确实尝试过这个,但是它似乎没有任何效果:

static {
  SpringDocUtils.getConfig().replaceParameterObjectWithClass(Instance.class, String.class);
}

如果可能的话,我想避免用相同的注释来注释数百个端点,并在全球范围内解决这个问题。

您可以定义自己的 ParameterCustomizer:

@Component
public class InstanceParameterCustomizer implements org.springdoc.core.customizers.ParameterCustomizer {
    @Override
    public Parameter customize(Parameter parameterModel, MethodParameter methodParameter) {
        if (Instance.class.equals(methodParameter.getParameterType()) && methodParameter.getParameterAnnotation(PathVariable.class) != null) {
            parameterModel.setName("id"); // if you need to change the name  ...
            parameterModel.setSchema(new StringSchema());
        }
        return parameterModel;
    }
}