SwaggerUI中的Rest API版本标头

时间:2017-03-14 17:26:53

标签: spring rest spring-mvc swagger swagger-ui

我想在我的Rest API(spring-mvc)文档中使用Springfox SwaggerUI。 我在@RequestMapping注释中使用版本标题,但如果我有两个版本的相同方法,在SwaggerUI中我只能看到一个。

例如:

@GetMapping(value = "/users", headers = "X-API-VERSION=1")
public List<User> getUsersV1(){...}

@GetMapping(value = "/users", headers = "X-API-VERSION=2")
public List<User> getUsersV2(){...}

上面的代码只会在api文档中显示一个方法。

是否有任何选项可以将Swagger配置为考虑我的版本标题而使用不同的端点?

2 个答案:

答案 0 :(得分:0)

Swagger通过其端点识别服务。

每个功能必须响应不同的端点,不应使用该功能的标头。

如果您正在使用REST服务,请阅读有关Restfull的内容并遵循其原则。此网址可以为您提供帮助:http://docs.oracle.com/javaee/6/tutorial/doc/gijqy.html

答案 1 :(得分:0)

经过一些研究后,我找到了解决问题的办法,也许将来会有所帮助。我添加&#34; #v&#34;使用PathDecorator的路径后缀。

现在我可以在生成的文档中看到我的所有方法。

@Component
@Order(value = Ordered.HIGHEST_PRECEDENCE + 70)
public class VersionPathDecorator implements PathDecorator {
    private final static Logger logger = LoggerFactory.getLogger(VersionPathDecorator.class);

@Override
public Function<String, String> decorator(PathContext context) {
    return (path) -> {
        StringBuilder sb = new StringBuilder(path);
        Field parent = null;
        try {
            parent = PathContext.class.getDeclaredField("parent");
            parent.setAccessible(true);
            RequestMappingContext rmc = (RequestMappingContext) parent.get(context);
            rmc.headers()
                    .stream()
                    .filter(h -> RequestHeader.X_API_VERSION.headerName.equals(h.getName()))
                    .map(NameValueExpression::getValue)
                    .findFirst()
                    .ifPresent(v -> sb.append("#v").append(v));

        } catch (NoSuchFieldException | IllegalAccessException e) {
            logger.error("path decoration failed", e);
        }

        return sb.toString();
    };
}

@Override
public boolean supports(DocumentationContext documentationContext) {
    return true;
}
}