3

I am currently trying to migrate from Springfox to Springdoc.

Most of my endpoints contain a @PathVariable Instance. Obviously I am only passing in the ID of the instance and Spring would automatically resolve the object for me.

Here is an example:

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

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

Called as /api/myInstance/role.

Springfox would handle this correctly for me, only generating {instance} as a String mapping to the ID of Instance. However, Springdoc expects the entire object to be passed as a path param.

I did try this so far, however it didn't seem to have any effect:

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

If possible, I'd like to avoid annotating hundreds of endpoints with the same annotation and solve this on a global level.

1 Answer 1

3

You can define your own 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;
    }
}
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.