你好,
也许四年后答案来得有点晚,但迟到总比不来好。
如果你有一个正确的 swagger 文件(不仅仅是一个片段),如下所示
openapi: "3.0.0"
:
paths:
/example:
get:
operationId: showIt
:
然后您运行代码生成,在此说明中针对 jaxs-jersey-server 没有任何代码生成特定配置值(您可以从
Swagger editor),你会得到大量的 java 类,如下所示:
io.swagger.api. ExampleApi
io.swagger.api. ExampleApiService
io.swagger.api.factories.ExampleApiServicefactory
io.swagger.api.impl. ExampleApiServiceImpl
在 REST 端点实现 ExampleApiServiceImpl 中,您或多或少会看到以下内容:
package io.swagger.api.impl;
:
import ... ;
:
@javax.annotation.Generated(...)
public
class ExampleApiServiceImpl
extends ExampleApiService
{
// ...
@Override
public
Response showIt( /* additional parameters , */ SecurityContext securityContext)
throws NotFoundException
{
// do some magic!
return Response.ok()
.entity(new ApiResponseMessage( ApiResponseMessage.OK
, "magic!"
)
)
.build();
}
// ...
}
你现在交换魔法评论了吗
// do some magic!
可能通过以下方式
String className = this.getClass().getSimpleName();
System.out.println("Entered REST endpoint: path=|" + className.substring(0, className.length() - 14) + "| operationId=|showId|");
如果您在完成mvn clean package jetty:run 后从浏览器调用端点,您应该会看到一条日志消息。但这不是一个好主意,正如您意识到的那样,因为在下一代之后,您的更改就消失了。
在这种情况下,手动更改生成的代码绝不是一个好主意,因为这必须有很好的文档记录,以便未来的同事(可能在几个月或几年后)即使是你)即使在星期一晚上的星期日半睡半醒,也会在下一次代码生成后再次进行更改。 但是我 20 多年使用不同代码生成器的经验只能说明这一点:算了! 出于同样的原因,在第一代之后阻止进一步的生成并不是真正面向目标的,因为这也必须被广泛记录。否则,调试时间超过调试时间可能会解决新功能不起作用的问题。
但这都不是必需的。
在生成的类 io.swagger.api.ExampleApi 中会发现如下构造函数(好吧,就是2019-05-17的状态,不知道是不是一样(或类似的)四年前)
package io.swagger.api;
:
import ... ;
:
@Path("/example")
@javax.annotation.Generated(...)
public class ExampleApi
{
private final ExampleApiService delegate;
public ExampleApi(@Context ServletConfig servletContext)
{
// ...
if (servletContext != null) {
String implClass = servletContext.getInitParameter("ExampleApi.implementation");
if (implClass != null && !"".equals(implClass.trim()))
{
try
{
delegate = (ExampleApiService) Class.forName(implClass).newInstance();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
}
// ...
}
// ...
}
重要的代码是servletContext.getInitParameter("...")。如果您现在在 servlet 配置中指定名称为 ExampleApi.implementation 的键以及从 ExampleApiService 派生的完整限定 java 类名,那么您已经实现了自己的端点代码,该端点代码可以安全地覆盖未来的代码生成。
为了完成示例,此规范将在(附加生成,oouuch,抱歉,您不能拥有所有内容)web.xml 文件中。该文件包含以下内容:
<servlet>
<servlet-name>jersey</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
...
<load-on-startup>1</load-on-startup>
</servlet>
在这个 xml 片段中,您必须在句点(代表其他 servlet 配置设置)之后插入以下内容:
<init-param>
<param-name>ExampleApi.implementation</param-name>
<param-value>my.swagger.api.MyExample</param-value>
</init-param>
好看,
不管你现在是什么!