DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
Introduction
The CXF OpenApiFeature allows you to generate OpenAPI v3.0 documents from JAX-RS service endpoints with a simple configuration. This feature can be configured programmatically in Java or using Spring or Blueprint beans.
Setup
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-service-description-openapi-v3</artifactId>
<version>3.2.4</version>
</dependency>
The cxf-rt-rs-service-description-openapi-v3 is only available in 3.2.x and above due to Java 8 baseline. For older releases, as well as for the users of older Swagger specifications 1.x/2.x, the is dedicated converter provided: org.apache.cxf.jaxrs.swagger.openapi.SwaggerToOpenApiConversionFilter.
Properties
The following optional parameters can be configured in OpenApiFeature. Note that although there are some similarities with Swagger specifications 1.x/2.x, OpenAPI v3.0 is a significant revamp of the specification (in a good sense of it).
| Name | Description | Default value (if applicable) | Sample value (if applicable) |
|---|---|---|---|
| securityDefinitions | a list of security definitions* | null | ["basicAuth" -> new SecurityScheme().type(Type.HTTP))] |
| customizer | the customizer class instance | null | new OpenApiCustomizer() |
| swaggerUiMavenGroupAndArtifact | the Maven artifacts to pinpoint SwaggerUI | null | "org.webjars.swagger-ui' |
| swaggerUiVersion | the version of SwaggerUI | null | "3.13.0" |
| supportSwaggerUi | turns on/off SwaggerUI support | false | false |
| filterClass | a security filter** | null | "com.example.filter.SampleFilter" |
| resourceClasses | a list of resource classes which must be scanned** | null | ["com.example.rest.SampleResource"] |
| resourcePackages | a list of package names where resources must be scanned** | null | ["com.example.rest"] |
| ignoredRoutes | excludes specific paths when scanning all resources (see scanAllResources)** | null | ["/api/test"] |
| prettyPrint | when generating openapi.json, pretty-print the JSON document** | true | true |
| runAsFilter | runs the feature as a filter | false | false |
| scan | Scan all JAX-RS resources automatically | true | true |
| readAllResources | Read all operations also with no @Operation** | true | true |
| termsOfServiceUrl | the terms of service URL* | null | null |
| licenseUrl | the license URL* | null | "http://www.apache.org/licenses/LICENSE-2.0.html" |
| license | the license* | null | "Apache 2.0 License" |
| contactUrl | the contact link* | null | null |
| contactEmail | the contact email* | null | "users@cxf.apache.org" |
| contactName | the contact name* | null | null |
| description | the description* | null | "The Sample REST Application with OpenAPI integration" |
| title | the title* | null | "Sample REST Application" |
| version | the version* | null | "1.0.0" |
* - the properties are defined in the OpenAPI class
** - the properties are defined in the SwaggerConfiguration class
Configuring from Code
import org.apache.cxf.jaxrs.openapi.OpenApiFeature;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.security.SecurityScheme.Type;
...
final OpenApiFeature feature = new OpenApiFeature();
feature.setContactEmail("cxf@apache.org");
feature.setLicense("Apache 2.0 License");
feature.setLicenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html");
feature.setSecurityDefinitions(Collections.singletonMap("basicAuth",new SecurityScheme().type(Type.HTTP)));
Configuring from Spring
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://cxf.apache.org/core"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
...
<!-- JAXRS providers -->
<bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
<!-- Application resources -->
<bean id="sampleResource" class="demo.jaxrs.swagger.server.Sample" />
<!-- CXF OpenApiFeature -->
<bean id="openApiFeature" class="org.apache.cxf.jaxrs.openapi.OpenApiFeature">
<!-- customize some of the properties -->
</bean>
...
<jaxrs:server id="sampleServer" address="/swaggerSample">
<jaxrs:serviceBeans>
<ref bean="sampleResource" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider" />
</jaxrs:providers>
<jaxrs:features>
<ref bean="openApiFeature" />
</jaxrs:features>
</jaxrs:server>
</beans>
Configuring in Blueprint
In case of Apache Karaf, the OpenAPI v3.0 integration is available as cxf-rs-description-openapi-v3 feature.
feature:install cxf-rs-description-openapi-v3
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://cxf.apache.org/blueprint/core"
xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd">
...
<!-- JAXRS providers -->
<bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
<!-- Application resources -->
<bean id="sampleResource" class="demo.jaxrs.swagger.server.Sample" />
<!-- CXF OpenApiFeature -->
<bean id="openApiFeature" class="org.apache.cxf.jaxrs.openapi.OpenApiFeature">
<!-- customize some of the properties -->
</bean>
...
<jaxrs:server id="sampleServer" address="/swaggerSample">
<jaxrs:serviceBeans>
<ref component-id="sampleResource" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref component-id="jsonProvider" />
</jaxrs:providers>
<jaxrs:features>
<ref component-id="openApiFeature" />
</jaxrs:features>
</jaxrs:server>
</blueprint>
Configuring in CXFNonSpringJaxrsServlet
<web-app>
<context-param>
<param-name>contextParam</param-name>
<param-value>contextParamValue</param-value>
</context-param>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
<init-param>
<param-name>jaxrs.serviceClasses</param-name>
<param-value>org.apache.cxf.systest.jaxrs.BookStore</param-value>
</init-param>
<init-param>
<param-name>jaxrs.features</param-name>
<param-value>org.apache.cxf.jaxrs.openapi.OpenApiFeature</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>