You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Colm O hEigeartaigh (Jira)" <ji...@apache.org> on 2020/01/15 10:24:01 UTC
[jira] [Closed] (CXF-8181) CXFNonSpringJaxrsServlet Feature
registration fails via javax.ws.rs.Application
[ 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)