我在一个集群中运行两个不同的Payara Micro微服务。
我遇到的问题是,当我尝试访问MyApp1的OpenAPI URL时http://mylink.com/myApp1/openapi它不起作用。当我使用URL时,它确实有效http://mylink.com/openapi.
当我想看到其他微服务的API时,这就成了一个问题http://mylink.com/myApp2/openapi这不起作用。
Payara Micro中是否有一种方法可以告诉OpenAPI在其路径中使用应用程序的上下文,就像应用程序中的所有其他URL一样?
正如你在我之前的评论中看到的,我也遇到过同样的情况。
上下文-openapi和微文件
首先,让我说在根目录中有/openapi URL是打开微文件的预期行为。文档总是使用/openapi路径作为获取文档链接的权限
在实施过程中,很明显,这种行为既需要强制执行:在OpenApi的Servlet ContainerInitializer中,可以看到以下代码
// Only deploy to app root
if (!"".equals(ctx.getContextPath())) {
return;
}
变通办法,又名解决方案。
现在很明显,我们无法对此进行配置,因为这是预期行为,一个解决方案(我提出的解决方案(是将请求代理到/YOUR_APP/openapi到/openapi。由于我的应用程序是部署在openshift上的jax-rs应用程序,并且我不想有专门的代理应用程序,所以我只创建了一个简单的Resource/Controller来代理这个特定的请求。背后的杰出方法:
@GET
@Path("")
public Response proxyOpenApiCall(){
log.debug("proxyOpenApiCall called");
String entity = client.target("http://localhost:8080")
.path("openapi").request()
.get(String.class);
return Response.ok(entity).build();
}
我用一个小的前向代理解决了这个问题。因此,我创建了一个新的REST enpoint,它可以从public调用并返回内部http端点的内容。
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@RequestScoped
@ApplicationPath("/")
@Path("/")
public class OpenApiProxyRestFacade extends Application {
private Client client;
@PostConstruct
public void init() {
this.client = ClientBuilder.newClient();
}
@GET
@Path("/openapi")
@Produces(MediaType.APPLICATION_JSON)
public Response proxyOpenApiCall() {
String entity = client.target("http://localhost:9080").path("openapi").request().get(String.class);
return Response.ok(entity).build();
}
@GET
@Path("/openapi/ui")
@Produces(MediaType.APPLICATION_JSON)
public Response proxyOpenApiUiCall() {
String entity = client.target("http://localhost:9080/openapi").path("ui").request().get(String.class);
return Response.ok(entity).build();
}
@PreDestroy
public void destroy() {
this.client.close();
}
}
对于openapi,您可以为url的更改设置此属性,因此它在所有之后都是可配置的
mp.openapi.extensions.path=/yourapi/whatever
对于openapi UI,设置此
openapi.ui.yamlUrl=/yourapi/whatever
来源:我第一次在谷歌上搜索mp.openapi.xxx
参数(我在源代码中找到了它们(,这让我找到了这个urlhttps://download.eclipse.org/microprofile/microprofile-open-api-1.0/microprofile-openapi-spec.html
在寻找更多的东西后,有一个简单的句子提到还有mp.openapi.extensions
,在谷歌上搜索了这些之后,我在这里找到了这个随机的文档https://github.com/wildfly/wildfly/blob/main/docs/src/main/asciidoc/_admin-guide/subsystem-configuration/MicroProfile_OpenAPI.adoc