Helidon MP OpenAPI не генерирует обновленный ответ конечной точки openapi
В настоящее время я создаю микросервис на основе Helidon Microprofile, следуя руководствам и учебным материалам от самих Oracle, но я столкнулся с проблемой, связанной с "Автоматическим генератором спецификаций OpenAPI" при использовании аннотаций.
Мой POM состоит из пакета MP и интеграции, чтобы заставить его работать с JPA, предоставляемым Hibernate.
Даже после настройки всех аннотаций на моем ресурсе он не генерирует обновленную спецификацию.
ПОМ
<dependencies>
<dependency>
<groupId>io.helidon.microprofile.bundles</groupId>
<artifactId>helidon-microprofile</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jandex</artifactId>
<version>2.1.1.Final</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.helidon.integrations.cdi</groupId>
<artifactId>helidon-integrations-cdi-datasource-hikaricp</artifactId>
<version>1.4.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.helidon.integrations.cdi</groupId>
<artifactId>helidon-integrations-cdi-jta-weld</artifactId>
<version>1.4.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.helidon.integrations.cdi</groupId>
<artifactId>helidon-integrations-cdi-hibernate</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<version>1.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>2.2.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.29.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.3</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>jwks-rsa</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Я использую только аннотации, указанные в руководствах, и @OpenAPIDefinition для определения таких вещей, как Название и Лицензия.
РЕСУРС
@OpenAPIDefinition(
info = @Info(
title = "Newsletter Microservice",
version = "1.0", description = "Microservice in charge of handling newsletter",
license = @License(name = "Apache 2.0", url = "https://www.apache.org/licenses/LICENSE-2.0"),
contact = @Contact(name = "Email", url = "mailto:email")
),
tags = {
@Tag(name = "public"), @Tag(name = "private")
}
)
@Path("/newsletter")
@RequestScoped
public class NewsletterClientResource {
ЖУРНАЛ
Connected to the target VM, address: '127.0.0.1:0', transport: 'socket'
Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
2019.12.02 20:01:19 INFO org.jboss.weld.Version Thread[main,5,main]: WELD-000900: 3.1.1 (Final)
2019.12.02 20:01:20 INFO org.jboss.weld.Bootstrap Thread[main,5,main]: WELD-ENV-000020: Using jandex for bean discovery
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.jboss.weld.util.bytecode.ClassFileUtils$1 (file:/C:/Users/Brenno%20Fagundes/.m2/repository/org/jboss/weld/weld-core-impl/3.1.1.Final/weld-core-impl-3.1.1.Final.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int)
WARNING: Please consider reporting this to the maintainers of org.jboss.weld.util.bytecode.ClassFileUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2019.12.02 20:01:21 INFO org.jboss.weld.Event Thread[main,5,main]: WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jersey.ext.cdi1x.internal.ProcessAllAnnotatedTypes.processAnnotatedType(@Observes ProcessAnnotatedType<?>, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
2019.12.02 20:01:21 INFO org.jboss.weld.Event Thread[main,5,main]: WELD-000411: Observer method [BackedAnnotatedMethod] private io.helidon.microprofile.openapi.IndexBuilder.processAnnotatedType(@Observes ProcessAnnotatedType<X>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
2019.12.02 20:01:22 INFO org.jboss.weld.Bootstrap Thread[main,5,main]: WELD-ENV-002003: Weld SE container 404f642b-892f-4676-960e-8df848aee3a3 initialized
2019.12.02 20:01:22 INFO io.helidon.microprofile.security.SecurityMpService Thread[main,5,main]: Security extension for microprofile is enabled, yet security configuration is missing from config (requires providers configuration at key security.providers). Security will not have any valid provider.
2019.12.02 20:01:22 INFO io.smallrye.openapi.api.OpenApiDocument Thread[main,5,main]: OpenAPI document initialized: io.smallrye.openapi.api.models.OpenAPIImpl@7793ad58
2019.12.02 20:01:23 INFO io.helidon.webserver.NettyWebServer Thread[main,5,main]: Version: 1.4.0
2019.12.02 20:01:24 INFO io.helidon.webserver.NettyWebServer Thread[nioEventLoopGroup-2-1,10,main]: Channel '@default' started: [id: 0x4e1f119b, L:/0:0:0:0:0:0:0:0:7200]
2019.12.02 20:01:24 INFO io.helidon.microprofile.server.ServerImpl Thread[nioEventLoopGroup-2-1,10,main]: Server initialized on http://localhost:7200 (and all other host addresses) in 5254 milliseconds.
BUMP, также, генерация работает с использованием настраиваемых фильтров и моделей, статическое определение в META-INF также работает. В настоящее время используется JDK 13.
РЕДАКТИРОВАТЬ: это мой класс приложения после изменений, предложенных Тимом Куинном.
КЛАСС ПРИМЕНЕНИЯ
@ApplicationScoped
@ApplicationPath("/")
@OpenAPIDefinition(
info = @Info(
title = "Newsletter Microservice",
version = "1.0", description = "Microservice in charge of handling newsletter",
license = @License(name = "Apache 2.0", url = "https://www.apache.org/licenses/LICENSE-2.0"),
contact = @Contact(name = "Email", url = "mailto:john.doe@gmail.com")
),
tags = {
@Tag(name = "public"), @Tag(name = "private")
}
)
public class NewsletterApplication extends Application {
@Override
public Set<Class<?>> getClasses(){
HashSet<Class<?>> classes = new HashSet<Class<?>>();
classes.add(NewsletterClientResource.class);
return classes;
}
}
Сгенерированный файл
---
openapi: 3.0.1
info:
title: Generated API
version: "1.0"
paths: {}
2 ответа
Бренно,
Вы не показали обновленный исходный код, но я предполагаю, что вы добавили @OpenAPIDefinition
аннотация к быстрому запуску GreetResource
класс, это правда?
Атрибуты этой аннотации описывают все приложение, а не подмножество его ресурсов, поэтому попробуйте переместить аннотацию в GreetApplication
class вместо этого:
@ApplicationScoped
@ApplicationPath("/")
@OpenAPIDefinition(info = @Info(title = "QuickStart API", version = "1.1"))
public class GreetApplication extends Application {...}
Это должно сработать. Я просто попробовал это на сгенерированном исходном примере быстрого запуска Helidon MP, перестроил, и сервер вернул ожидаемые результаты.
Вот разница для внесенного мной изменения:
diff --git a/examples/quickstarts/helidon-quickstart-mp/src/main/java/io/helidon/examples/quickstart/mp/GreetApplication.java b/examples/quickstarts/helidon-quickstart-mp/src/main/java/io/helidon/examples/quickstart/mp/GreetApplication.java
index fd140738..cca60da2 100644
--- a/examples/quickstarts/helidon-quickstart-mp/src/main/java/io/helidon/examples/quickstart/mp/GreetApplication.java
+++ b/examples/quickstarts/helidon-quickstart-mp/src/main/java/io/helidon/examples/quickstart/mp/GreetApplication.java
@@ -23,12 +23,15 @@ import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import io.helidon.common.CollectionsHelper;
+import org.eclipse.microprofile.openapi.annotations.OpenAPIDefinition;
+import org.eclipse.microprofile.openapi.annotations.info.Info;
/**
* Simple Application that produces a greeting message.
*/
@ApplicationScoped
@ApplicationPath("/")
+@OpenAPIDefinition(info = @Info(title = "QuickStart API", version = "1.1"))
public class GreetApplication extends Application {
@Override
И вот начало обновленного документа OpenAPI, возвращенного сервером:
---
openapi: 3.0.1
info:
title: QuickStart API
version: "1.1"
paths:
Как и ожидалось, название и версия изменились.
Случай 1. Вы используете Яндекс и не обновляетесь.
Если вы используете jandex, высока вероятность, что ваш jandex.idx не обновляется. Вы можете сделать это, запустив
mvn process-classes
Случай 2: вы не используете яндекс и при нажатии
/openapi
вы получите несколько пустой ответ.
Похоже, это проблема Helidon. Зависимости
helidon-integrations-cdi-jpa, helidon-integrations-cdi-jta, helidon-integrations-cdi-eclipselink etc...
содержит
jandex.idx
и Helidon теперь думает, что jandex включен и будет читать только из этих файлов jandex, пропуская ваши ресурсы. Так что пока вы можете включить плагин jandex, чтобы решить эту проблему.