Hi Jean, JPU> 1. a jaxrs server on url: '/<basePath>/services/service1'
Correct, so in the relative form like address="/<something>", the JAX-RS endpoint path would be: <baseUrl>/<servlet path mapping>/<address>/[@ApplicationPath]/[@Path] The @ApplicationPath is optional in this case. JPU> 2. a jaxws service endpoint on '/<basePath>/services/service2' The JAX-WS is very different from JAX-RS, essentially the action comes inside the SOAP message behind <baseUrl>/<servlet path mapping>/ (@Path / @ApplicationPath are not relevant there). JPU> Question: Because now address="/" is set for the jaxrs:server will it also JPU> inspect requests targeted for the jaxws service as those requests have start JPU> with the same path '/<basePath>/services/... This is a good question, I have not done it myself but I think it should work: the servlet dispatches according to registered services, in this regard JAX-RS and JAX-WS should not conflict. Does it work in your case? Thank you. Best Regards, Andriy Redko JPU> Hi Andriy, JPU> Using address="/" seems to work but still I don't understand how the JPU> following work together: JPU> - path specification in servlet mapping for the CXF servlet JPU> (org.apache.cxf.transport.servlet.CXFServlet) JPU> - the 'address' attribute on the jaxrs:server bean declaration JPU> - the javax.ws.rs.Path or javax.jws.WebService annotation on the service JPU> API description JPU> Say I've two services with (relateive to the host) url's: JPU> 1. a jaxrs server on url: '/<basePath>/services/service1' JPU> 2. a jaxws service endpoint on '/<basePath>/services/service2' JPU> How do I configure above 3 aspects? Currently I have (working): JPU> 1.for the jaxrs:server endpoint: JPU> - servlet path mapping: '/services/*' JPU> - jaxrs-server address attribute: address="/" JPU> - @Path annotation: @Path("service1") JPU> 2.For the jaxws service endpoint: JPU> - servlet path mapping: '/services/*' (JAXWS and JAXRS requests are handleb JPU> by the same CXF servle) JPU> - jaxws:endpoint server address attribute: JPU> address="/service2" JPU> - @WebService(name="service2") JPU> A correct request for '1' would be '/basePath>/services/service1/<ID>'. JPU> A correct request for '2' would be '/basePath>/services/service2'. JPU> The jaxrs/jaxws configuration behavior seem to differ with respect to: JPU> - the server address attribute JPU> - The API annotation (@Path or @Webservice) JPU> The JAXWS server address attribute doesn't seem to interfere with the JPU> @Webservice annotation. While the jaxrs server address attribute does seem JPU> to interfere with the @Path annotation. I would have expected the jaxrs JPU> server aspects to be configured as: JPU> - servlet path mapping: '/services/*' JPU> - jaxrs-server address attribute: address="/service1" JPU> - @Path annotation: @Path("service1") JPU> but then a valid request would be '/basePath>>/services/service1/service1/<ID>'. JPU> For both the 'address' attribute is relative to the servlet path. JPU> The @Path Javadoc mentions that this path is relative to the ApplicationPath JPU> which thus seems to be relative to the jaxrs-server address attribute. As JPU> for @Webservice it doesnn't seem to be url-path related. JPU> Question: Because now address="/" is set for the jaxrs:server will it also JPU> inspect requests targeted for the jaxws service as those requests have start JPU> with the same path '/<basePath>/services/...'. JPU> Albeit somewhat confusing. JPU> J.P. JPU> -----Original Message----- JPU> From: Andriy Redko <drr...@gmail.com> JPU> Sent: dinsdag 14 juni 2022 1:08 JPU> To: Jean Pierre URKENS <jean-pierre.urk...@devoteam.com>; JPU> iss...@cxf.apache.org; dev@cxf.apache.org JPU> Subject: Re: JAXRS server endpoint not gracefully shutdown JPU> Hi Jean, JPU> Indeed, the jaxrs:server does not expect address to be omitted, you could JPU> use the "/" (and I believe an empty string would also make it): JPU> <jaxrs:server id="restServer" basePackages="xxx" address="/"> ... JPU> </jaxrs:server> JPU> Thank you. JPU> Hope it helps. JPU> Best Regards, JPU> Andriy Redko JPU>> I create a JAXRS server endpoint (CXF 3.5.2) using spring bean JPU>> declarations JPU>> like: JPU>> <jaxrs:server id="restServer" basePackages="xxx"> JPU>> <jaxrs:serviceBeans> JPU>> <ref bean="TestApi" /> JPU>> </jaxrs:serviceBeans> JPU>> <jaxrs:providers> JPU>> <…/> JPU>> </jaxrs:providers> JPU>> <jaxrs:features> JPU>> <… /> JPU>> </jaxrs:features> JPU>> <jaxrs:inInterceptors> JPU>> <… /> JPU>> </jaxrs:inInterceptors> JPU>> <jaxrs:outInterceptors>* JPU>> <**…**/>* JPU>> </jaxrs:outInterceptors>* JPU>> </jaxrs:server> JPU>> Here my “TestApi” bean interface is declared like: JPU>> @Path("accounts") JPU>> @Consumes(MediaType.*APPLICATION_JSON*) JPU>> @Produces(MediaType.*APPLICATION_JSON*) JPU>> public interface TestApi { JPU>> … JPU>> } JPU>> And CXF is triggered via a servlet configuration like: JPU>> <servlet> JPU>> <display-name>CXF Servlet</display-name> JPU>> <servlet-name>CXFServlet</servlet-name> JPU>> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet JPU>> -class> JPU>> </servlet> JPU>> <servlet-mapping> JPU>> <servlet-name>CXFServlet</servlet-name> JPU>> <url-pattern>/services/*</url-pattern> JPU>> </servlet-mapping> JPU>> Because I’ve got the @Path declaration on the interface type I’ve JPU>> omitted JPU>> the address=”accounts” attribute on the jaxrs:server declaration JPU>> since otherwise JPU>> I noticed that the server would be listening to /basepath/services/ JPU>> accounts/accounts/…). JPU>> Now this configuration works perfectly, only when shutting down the JPU>> application server cxf calls JPU>> ServerImpl#destroy() JPU>> which delegates (via Obeservable) to JPU>> AbstractHTTPDestination#deactivate() JPU>> which calls JPU>> registry.removeDestination(path). JPU>> This path is null (no ‘address’ specified on jaxrs:server JPU>> declaration) and results in a NPE on the registry Map. JPU>> This causes an unclean shutdown of my server. JPU>> Is this an error in cxf or is my jaxrs:server configured incorrectly? JPU>> How does the ‘address’ attribute on the jaxrs:server declaration JPU>> correctly interact with the @Path parameter on the API interface?