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.