[ https://issues.apache.org/jira/browse/CXF-8181?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Colm O hEigeartaigh closed CXF-8181. ------------------------------------ > CXFNonSpringJaxrsServlet Feature registration fails via > javax.ws.rs.Application > ------------------------------------------------------------------------------- > > Key: CXF-8181 > URL: https://issues.apache.org/jira/browse/CXF-8181 > Project: CXF > Issue Type: Bug > Components: JAX-RS > Affects Versions: 3.2.11, 3.3.4 > Reporter: Noel Ang > Assignee: Colm O hEigeartaigh > Priority: Major > Fix For: 3.4.0, 3.3.5, 3.2.12 > > > *CXFNonSpringJaxrsServlet* always overwrites Features surfaced by a > javax.ws.rs.core.Application implementation with Features specified in the > servlet configuration, _even if the latter set is empty_. > The server factory bean > [created|https://github.com/apache/cxf/blob/b75830ffd90cab9cfcdc7550fdd17490dbe9c8c5/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/servlet/CXFNonSpringJaxrsServlet.java#L514-L519] > to encapsulate the instantiated Application class has its Features list > initialized twice. > * The [first > time|https://github.com/apache/cxf/blob/b75830ffd90cab9cfcdc7550fdd17490dbe9c8c5/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java#L947] > uses the classes [that the Application > yields|https://github.com/apache/cxf/blob/b75830ffd90cab9cfcdc7550fdd17490dbe9c8c5/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java#L903-L904]. > * The [second > time|https://github.com/apache/cxf/blob/b75830ffd90cab9cfcdc7550fdd17490dbe9c8c5/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/servlet/CXFNonSpringJaxrsServlet.java#L529-L530] > uses the classes that the [Servlet configuration > describes|https://github.com/apache/cxf/blob/b75830ffd90cab9cfcdc7550fdd17490dbe9c8c5/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/servlet/CXFNonSpringJaxrsServlet.java#L323-L326]. > The features enumerated by the servlet config > [replaces|https://github.com/apache/cxf/blob/b75830ffd90cab9cfcdc7550fdd17490dbe9c8c5/core/src/main/java/org/apache/cxf/endpoint/AbstractEndpointFactory.java#L176-L178] > the first list. > > I discovered the problem while trying to get OpenAPI 3.0 / Swagger-UI support > to work, so FWIW, an example: > * Application implementation that registers OpenApiFeature. > > {code:java} > package org.foo.service; > import org.apache.cxf.feature.Feature; > import org.apache.cxf.jaxrs.openapi.OpenApiFeature; > import java.util.Collection; > import java.util.HashSet; > import java.util.Set; > import javax.ws.rs.ApplicationPath; > import javax.ws.rs.core.Application; > import static java.util.Objects.requireNonNull; > @ApplicationPath("FooService") > public class FooServiceApplication extends Application > { > @Override > public Set<Class<?>> getClasses () > { > Set<Class<?>> classes = new HashSet<>(); > classes.add(Resource1.class); > classes.add(Resource2.class); > return classes; > } > @Override > public Set<Object> getSingletons () > { > Set<Object> singletons = new HashSet<>(); > singletons.add(openapiFeature()); > return singletons; > } > private Feature openapiFeature () { > /* > * Enables automatic Swagger document generation for the web service. > */ > OpenApiFeature feature = new OpenApiFeature(); > feature.setTitle("FooService"); > feature.setReadAllResources(false); > feature.setPrettyPrint(true); > feature.setSupportSwaggerUi(true); > return feature; > } > } > {code} > * Corresponding servlet config - Swagger-UI support does not enable unless > the commented-out section below is enabled. > > {code:java} > <?xml version="1.0"?> > <web-app xmlns="http://java.sun.com/xml/ns/javaee" version="3.0"> > > <display-name>FooService</display-name> > > <servlet> > <servlet-name>FooService</servlet-name> > > <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class> > > <init-param> > <param-name>javax.ws.rs.Application</param-name> > <param-value>org.foo.service.FooServiceApplication</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>SLA835Gateway</servlet-name> > <url-pattern>/*</url-pattern> > </servlet-mapping> > > <session-config> > <session-timeout>1</session-timeout> > </session-config> > </web-app> > {code} > > > -- This message was sent by Atlassian Jira (v8.3.4#803005)