[
https://issues.apache.org/jira/browse/CXF-7563?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Daniyar Yeralin updated CXF-7563:
---------------------------------
Description:
We are using SpringBoot + JAX-RS server and define two service beans that lie
under *2 separate packages*. The jaxrs server is configured with
Swagger2Feature to generate the swagger.json, but the operationIds and thus the
URIs for these services get appended with '_1'.
Sample (Gradle + IDEA) project:
https://github.com/yeralin/ReproduceBug-CXF-7563-
Structure:
!https://i.imgur.com/Q0hh4O3.png!
Sample Java class:
{code:java}
@SpringBootApplication
public class DemoApplication {
@Autowired
private SampleService sampleService;
@Autowired
private SampleServiceInternal sampleServiceInternal;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean(destroyMethod = "shutdown")
public SpringBus cxf() {
return new SpringBus();
}
@Bean(destroyMethod = "destroy")
@DependsOn("cxf")
public Server jaxRsServer() {
final JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
factory.setServiceBeans(Arrays.asList(sampleService,
sampleServiceInternal));
factory.setBus(cxf());
factory.setAddress("/");
factory.setFeatures(Arrays.asList(configureSwagger()));
return factory.create();
}
private Swagger2Feature configureSwagger() {
Swagger2Feature feature = new Swagger2Feature();
feature.setBasePath("/");
return feature;
}
}
{code}
Swagger.json:
{code:javascript}
// 20171114155626
// http://localhost:17070/services/swagger.json
{
"swagger": "2.0",
"info": {
"description": "The Application",
"version": "1.0.0",
"title": "Sample REST Application",
"contact": {
"name": "[email protected]"
},
"license": {
"name": "Apache 2.0 License",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
}
},
"basePath": "/services",
"tags": Array[2][
{
"name": "internal"
},
{
"name": "test"
}
],
"paths": {
"/Internal/internal": {
"get": {
"tags": Array[1][
"internal"
],
"operationId": "getInternal_1",
"parameters": Array[0][
],
"responses": {
"200": {
"description": "successful operation",
"schema": {
"type": "string"
},
"headers": {
}
}
}
}
},
"/test/test": {
"get": {
"tags": Array[1][
"test"
],
"operationId": "getTest_1",
"parameters": Array[0][
],
"responses": {
"200": {
"description": "successful operation",
"schema": {
"type": "string"
},
"headers": {
}
}
}
}
}
}
}
{code}
Logs at startup:
{code:java}
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.8.RELEASE)
2017-11-14 16:25:11.655 INFO 69492 --- [ main]
reproduce.bug.demo.DemoApplication : Starting DemoApplication on
daniyars-mbp.usny.ibm.com with PID 69492
(/Users/Daniyar.Yeralin/Repositories/demo/out/production/classes started by
Daniyar.Yeralin in /Users/Daniyar.Yeralin/Repositories/demo)
2017-11-14 16:25:11.657 INFO 69492 --- [ main]
reproduce.bug.demo.DemoApplication : The following profiles are active:
reactive
2017-11-14 16:25:11.714 INFO 69492 --- [ main]
ationConfigEmbeddedWebApplicationContext : Refreshing
org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6af93788:
startup date [Tue Nov 14 16:25:11 EST 2017]; root of context hierarchy
2017-11-14 16:25:12.893 INFO 69492 --- [ main]
s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s):
17070 (http)
2017-11-14 16:25:12.906 INFO 69492 --- [ main]
o.apache.catalina.core.StandardService : Starting service [Tomcat]
2017-11-14 16:25:12.907 INFO 69492 --- [ main]
org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache
Tomcat/8.5.23
2017-11-14 16:25:13.001 INFO 69492 --- [ost-startStop-1]
o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded
WebApplicationContext
2017-11-14 16:25:13.002 INFO 69492 --- [ost-startStop-1]
o.s.web.context.ContextLoader : Root WebApplicationContext:
initialization completed in 1292 ms
2017-11-14 16:25:13.286 INFO 69492 --- [ost-startStop-1]
o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet'
to [/]
2017-11-14 16:25:13.289 INFO 69492 --- [ost-startStop-1]
o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'CXFServlet' to
[/services/*]
2017-11-14 16:25:13.291 INFO 69492 --- [ost-startStop-1]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
'characterEncodingFilter' to: [/*]
2017-11-14 16:25:13.291 INFO 69492 --- [ost-startStop-1]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
'hiddenHttpMethodFilter' to: [/*]
2017-11-14 16:25:13.291 INFO 69492 --- [ost-startStop-1]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
'httpPutFormContentFilter' to: [/*]
2017-11-14 16:25:13.291 INFO 69492 --- [ost-startStop-1]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
'requestContextFilter' to: [/*]
2017-11-14 16:25:13.448 INFO 69492 --- [ main]
org.apache.cxf.endpoint.ServerImpl : Setting the server's publish address
to be /
2017-11-14 16:25:13.693 INFO 69492 --- [ main]
s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice:
org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6af93788:
startup date [Tue Nov 14 16:25:11 EST 2017]; root of context hierarchy
2017-11-14 16:25:13.741 INFO 69492 --- [ main]
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public
org.springframework.http.ResponseEntity<java.util.Map<java.lang.String,
java.lang.Object>>
org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2017-11-14 16:25:13.742 INFO 69492 --- [ main]
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped
"{[/error],produces=[text/html]}" onto public
org.springframework.web.servlet.ModelAndView
org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2017-11-14 16:25:13.761 INFO 69492 --- [ main]
o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto
handler of type [class
org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-11-14 16:25:13.762 INFO 69492 --- [ main]
o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler
of type [class
org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-11-14 16:25:13.785 INFO 69492 --- [ main]
o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico]
onto handler of type [class
org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-11-14 16:25:13.887 INFO 69492 --- [ main]
o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure
on startup
2017-11-14 16:25:13.946 INFO 69492 --- [ main]
s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 17070
(http)
2017-11-14 16:25:13.951 INFO 69492 --- [ main]
reproduce.bug.demo.DemoApplication : Started DemoApplication in 2.663
seconds (JVM running for 3.025)
{code}
was:
We are using SpringBoot + JAX-RS server and define two service beans that lie
under *2 separate packages*. The jaxrs server is configured with
Swagger2Feature to generate the swagger.json, but the operationIds and thus the
URIs for these services get appended with '_1'.
Sample (Gradle + IDEA) project:
https://github.com/yeralin/ReproduceBug-CXF-7563-
Structure:
!https://i.imgur.com/Q0hh4O3.png!
Sample Java class:
{code:java}
@SpringBootApplication
public class DemoApplication {
@Autowired
private SampleService sampleService;
@Autowired
private SampleServiceInternal sampleServiceInternal;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean(destroyMethod = "shutdown")
public SpringBus cxf() {
return new SpringBus();
}
@Bean(destroyMethod = "destroy")
@DependsOn("cxf")
public Server jaxRsServer() {
final JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
factory.setServiceBeans(Arrays.asList(sampleService,
sampleServiceInternal));
factory.setBus(cxf());
factory.setAddress("/");
factory.setFeatures(Arrays.asList(configureSwagger()));
return factory.create();
}
private Swagger2Feature configureSwagger() {
Swagger2Feature feature = new Swagger2Feature();
feature.setBasePath("/");
return feature;
}
}
{code}
Swagger.json:
{code:javascript}
// 20171114155626
// http://localhost:17070/services/swagger.json
{
"swagger": "2.0",
"info": {
"description": "The Application",
"version": "1.0.0",
"title": "Sample REST Application",
"contact": {
"name": "[email protected]"
},
"license": {
"name": "Apache 2.0 License",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
}
},
"basePath": "/services",
"tags": Array[2][
{
"name": "internal"
},
{
"name": "test"
}
],
"paths": {
"/Internal/internal": {
"get": {
"tags": Array[1][
"internal"
],
"operationId": "getInternal_1",
"parameters": Array[0][
],
"responses": {
"200": {
"description": "successful operation",
"schema": {
"type": "string"
},
"headers": {
}
}
}
}
},
"/test/test": {
"get": {
"tags": Array[1][
"test"
],
"operationId": "getTest_1",
"parameters": Array[0][
],
"responses": {
"200": {
"description": "successful operation",
"schema": {
"type": "string"
},
"headers": {
}
}
}
}
}
}
}
{code}
> Non-unique operationIds in swagger.json result in '_1' appended
> ---------------------------------------------------------------
>
> Key: CXF-7563
> URL: https://issues.apache.org/jira/browse/CXF-7563
> Project: CXF
> Issue Type: Bug
> Components: JAX-RS
> Affects Versions: 3.1.11
> Environment: Tested on two systems:
> 1) Darwin 17.2.0 Darwin Kernel Version 17.2.0: Fri Sep 29 18:27:05 PDT 2017;
> root:xnu-4570.20.62~3/RELEASE_X86_64 x86_64
> 2) Linux 2.6.32-696.1.1.el6.x86_64 #1 SMP Tue Mar 21 12:19:18 EDT 2017 x86_64
> x86_64 x86_64 GNU/Linux
> Reporter: Daniyar Yeralin
> Priority: Minor
>
> We are using SpringBoot + JAX-RS server and define two service beans that lie
> under *2 separate packages*. The jaxrs server is configured with
> Swagger2Feature to generate the swagger.json, but the operationIds and thus
> the URIs for these services get appended with '_1'.
> Sample (Gradle + IDEA) project:
> https://github.com/yeralin/ReproduceBug-CXF-7563-
> Structure:
> !https://i.imgur.com/Q0hh4O3.png!
> Sample Java class:
> {code:java}
> @SpringBootApplication
> public class DemoApplication {
> @Autowired
> private SampleService sampleService;
> @Autowired
> private SampleServiceInternal sampleServiceInternal;
> public static void main(String[] args) {
> SpringApplication.run(DemoApplication.class, args);
> }
> @Bean(destroyMethod = "shutdown")
> public SpringBus cxf() {
> return new SpringBus();
> }
> @Bean(destroyMethod = "destroy")
> @DependsOn("cxf")
> public Server jaxRsServer() {
> final JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
> factory.setServiceBeans(Arrays.asList(sampleService,
> sampleServiceInternal));
> factory.setBus(cxf());
> factory.setAddress("/");
> factory.setFeatures(Arrays.asList(configureSwagger()));
> return factory.create();
> }
> private Swagger2Feature configureSwagger() {
> Swagger2Feature feature = new Swagger2Feature();
> feature.setBasePath("/");
> return feature;
> }
> }
> {code}
> Swagger.json:
> {code:javascript}
> // 20171114155626
> // http://localhost:17070/services/swagger.json
> {
> "swagger": "2.0",
> "info": {
> "description": "The Application",
> "version": "1.0.0",
> "title": "Sample REST Application",
> "contact": {
> "name": "[email protected]"
> },
> "license": {
> "name": "Apache 2.0 License",
> "url": "http://www.apache.org/licenses/LICENSE-2.0.html"
> }
> },
> "basePath": "/services",
> "tags": Array[2][
> {
> "name": "internal"
> },
> {
> "name": "test"
> }
> ],
> "paths": {
> "/Internal/internal": {
> "get": {
> "tags": Array[1][
> "internal"
> ],
> "operationId": "getInternal_1",
> "parameters": Array[0][
>
> ],
> "responses": {
> "200": {
> "description": "successful operation",
> "schema": {
> "type": "string"
> },
> "headers": {
>
> }
> }
> }
> }
> },
> "/test/test": {
> "get": {
> "tags": Array[1][
> "test"
> ],
> "operationId": "getTest_1",
> "parameters": Array[0][
>
> ],
> "responses": {
> "200": {
> "description": "successful operation",
> "schema": {
> "type": "string"
> },
> "headers": {
>
> }
> }
> }
> }
> }
> }
> }
> {code}
> Logs at startup:
> {code:java}
> . ____ _ __ _ _
> /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
> ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
> \\/ ___)| |_)| | | | | || (_| | ) ) ) )
> ' |____| .__|_| |_|_| |_\__, | / / / /
> =========|_|==============|___/=/_/_/_/
> :: Spring Boot :: (v1.5.8.RELEASE)
> 2017-11-14 16:25:11.655 INFO 69492 --- [ main]
> reproduce.bug.demo.DemoApplication : Starting DemoApplication on
> daniyars-mbp.usny.ibm.com with PID 69492
> (/Users/Daniyar.Yeralin/Repositories/demo/out/production/classes started by
> Daniyar.Yeralin in /Users/Daniyar.Yeralin/Repositories/demo)
> 2017-11-14 16:25:11.657 INFO 69492 --- [ main]
> reproduce.bug.demo.DemoApplication : The following profiles are active:
> reactive
> 2017-11-14 16:25:11.714 INFO 69492 --- [ main]
> ationConfigEmbeddedWebApplicationContext : Refreshing
> org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6af93788:
> startup date [Tue Nov 14 16:25:11 EST 2017]; root of context hierarchy
> 2017-11-14 16:25:12.893 INFO 69492 --- [ main]
> s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s):
> 17070 (http)
> 2017-11-14 16:25:12.906 INFO 69492 --- [ main]
> o.apache.catalina.core.StandardService : Starting service [Tomcat]
> 2017-11-14 16:25:12.907 INFO 69492 --- [ main]
> org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache
> Tomcat/8.5.23
> 2017-11-14 16:25:13.001 INFO 69492 --- [ost-startStop-1]
> o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded
> WebApplicationContext
> 2017-11-14 16:25:13.002 INFO 69492 --- [ost-startStop-1]
> o.s.web.context.ContextLoader : Root WebApplicationContext:
> initialization completed in 1292 ms
> 2017-11-14 16:25:13.286 INFO 69492 --- [ost-startStop-1]
> o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet:
> 'dispatcherServlet' to [/]
> 2017-11-14 16:25:13.289 INFO 69492 --- [ost-startStop-1]
> o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'CXFServlet' to
> [/services/*]
> 2017-11-14 16:25:13.291 INFO 69492 --- [ost-startStop-1]
> o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
> 'characterEncodingFilter' to: [/*]
> 2017-11-14 16:25:13.291 INFO 69492 --- [ost-startStop-1]
> o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
> 'hiddenHttpMethodFilter' to: [/*]
> 2017-11-14 16:25:13.291 INFO 69492 --- [ost-startStop-1]
> o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
> 'httpPutFormContentFilter' to: [/*]
> 2017-11-14 16:25:13.291 INFO 69492 --- [ost-startStop-1]
> o.s.b.w.servlet.FilterRegistrationBean : Mapping filter:
> 'requestContextFilter' to: [/*]
> 2017-11-14 16:25:13.448 INFO 69492 --- [ main]
> org.apache.cxf.endpoint.ServerImpl : Setting the server's publish
> address to be /
> 2017-11-14 16:25:13.693 INFO 69492 --- [ main]
> s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice:
> org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6af93788:
> startup date [Tue Nov 14 16:25:11 EST 2017]; root of context hierarchy
> 2017-11-14 16:25:13.741 INFO 69492 --- [ main]
> s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public
> org.springframework.http.ResponseEntity<java.util.Map<java.lang.String,
> java.lang.Object>>
> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
> 2017-11-14 16:25:13.742 INFO 69492 --- [ main]
> s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped
> "{[/error],produces=[text/html]}" onto public
> org.springframework.web.servlet.ModelAndView
> org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
> 2017-11-14 16:25:13.761 INFO 69492 --- [ main]
> o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto
> handler of type [class
> org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
> 2017-11-14 16:25:13.762 INFO 69492 --- [ main]
> o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler
> of type [class
> org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
> 2017-11-14 16:25:13.785 INFO 69492 --- [ main]
> o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico]
> onto handler of type [class
> org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
> 2017-11-14 16:25:13.887 INFO 69492 --- [ main]
> o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure
> on startup
> 2017-11-14 16:25:13.946 INFO 69492 --- [ main]
> s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 17070
> (http)
> 2017-11-14 16:25:13.951 INFO 69492 --- [ main]
> reproduce.bug.demo.DemoApplication : Started DemoApplication in 2.663
> seconds (JVM running for 3.025)
> {code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)