Здравствуйте,
может быть, через четыре года ответ приходит с небольшим опозданием, но лучше поздно, чем никогда.
Если у вас есть правильный файл swagger (а не только фрагмент), например следующий
openapi: "3.0.0"
:
paths:
/example:
get:
operationId: showIt
:
и вы запускаете генерацию кода в этом объяснении для jaxs-jersey-server без каких-либо значений конфигурации, специфичных для генерации кода (которые вы можете загрузить из редактор Swagger), вы получаете множество классов 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-летний опыт работы с разными генераторами кода говорит по этому поводу только одно: Забудьте об этом! strong> По той же причине нецелесообразно предотвращать дальнейшее поколение после первого поколения, потому что это тоже должно быть подробно задокументировано. В противном случае час отладки за час отладки может привести к устранению неполадок, почему новая функция не работает.
Но это совсем не обязательно.
В сгенерированном классе io.swagger.api.ExampleApi вы найдете конструктор, подобный следующему (Хорошо, это состояние на 17 мая 2019 г. Я не знаю, было ли это так же (или похоже) четыре года назад)
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("...")
. Если теперь вы укажете в конфигурации сервлета ключ с именем ExampleApi.implementation
с полным квалифицированным именем класса Java, полученным из ExampleApiService
, вы реализуете свой собственный код конечной точки, который защищен от перезаписи в будущих поколениях кода.
Для завершения примера эта спецификация должна быть сделана в (дополнительно сгенерированном, оууууу, извините, вы не можете иметь все) 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-фрагменте вы должны вставить после точек (которые обозначают другие параметры конфигурации сервлета) следующее:
<init-param>
<param-name>ExampleApi.implementation</param-name>
<param-value>my.swagger.api.MyExample</param-value>
</init-param>
Смотри,
кем бы ты ни был!
person
Chris
schedule
17.05.2019