Migration springfox ParameterBuilderPlugin to openapi 2.2.0

106 views Asked by At

I have a project with java 11 and spring boot 2.3.0 and swagger 3.0. Now i have to migrate this project to java 17 with spring boot 3.1.4 and openapi 2.2.0. I have this class

import org.springframework.stereotype.Component;
import springfox.documentation.service.ResolvedMethodParameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.ParameterBuilderPlugin;
import springfox.documentation.spi.service.contexts.ParameterContext;

import java.util.Optional;

@Component
public class TransactionIdSwaggerParameter implements ParameterBuilderPlugin {

    @Override
    public void apply(ParameterContext parameterContext) {
        ResolvedMethodParameter methodParameter = parameterContext.resolvedMethodParameter();
        Optional<TransactionId> requestParam = methodParameter.findAnnotation(TransactionId.class);
        if (requestParam.isPresent()) {
            parameterContext.requestParameterBuilder().in(requestParam.get().type());
            parameterContext.requestParameterBuilder().description(requestParam.get().description());
            parameterContext.requestParameterBuilder().required(requestParam.get().required());
            parameterContext.requestParameterBuilder().name(requestParam.get().name());
        }
    }

    @Override
    public boolean supports(DocumentationType documentationType) {
        return true;
    }
}

The interface TransactionId

import springfox.documentation.service.ParameterType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface TransactionId {
    String value() default "exw-transaction-id";
    String name() default "exw-transaction-id";
    String description() default "EXW transaction ID";
    boolean required() default false;
    ParameterType type() default ParameterType.HEADER;
}

finally i have added this interface to HandlerMethodArgumentResolver of spring to inject parameter from header request to my controllers

@Component
public class TransactionIdArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(TransactionId.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest();
        TransactionId parameterAnnotation = methodParameter.getParameterAnnotation(TransactionId.class);

        if (StringUtils.isNotBlank(request.getHeader(parameterAnnotation.value()))) {
            return request.getHeader(parameterAnnotation.value());
        }

        String transactionId = MDC.get(LabelUtils.TRACE_ID);
        if (StringUtils.isNotBlank(transactionId)) {
            return transactionId;
        }

        return UUID.randomUUID().toString();
    }
}

the class TransactionIdSwaggerParameter allows me to costumize swagger documentation of my custom annotation. I cannot find any way to do this with openapi. Have u any idea ?

i have looked for alternative solutions, but i found nothing.

0

There are 0 answers