仅针对 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;
}
}
我目前正在尝试从 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;
}
}