[ https://issues.apache.org/jira/browse/CXF-5702?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15194330#comment-15194330 ]
Jan Cetkovsky edited comment on CXF-5702 at 3/14/16 11:17 PM: -------------------------------------------------------------- <servlet> <servlet-name>com.example.MyApplication</servlet-name> <load-on-startup>1</load-on-startup> <init-param> <param-name>ignore.application.path</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>com.example.MyApplication</servlet-name> <url-pattern>/aaa/*</url-pattern> </servlet-mapping> @ApplicationPath("/rs/ga/v1") public class MyApplication extends Application { REST Application: http://localhost:8080/registry/aaa/rs/ga/v1 -> com.example.MyApplication doesn't seem to work on the 2.7.x . I am running it on TomEE 1.7.3 and I'm not explicitly defining it to be CXF servlet, if it makes difference. EDIT: Just tested it on TomEE 7 which has CXF 3.1.x and if this was fixed in 3.0, the problem probably lies with the openEJB wrapper there was (Author: jan.cetkov...@gmail.com): <servlet> <servlet-name>com.example.MyApplication</servlet-name> <load-on-startup>1</load-on-startup> <init-param> <param-name>ignore.application.path</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>com.example.MyApplication</servlet-name> <url-pattern>/aaa/*</url-pattern> </servlet-mapping> @ApplicationPath("/rs/ga/v1") public class MyApplication extends Application { REST Application: http://localhost:8080/registry/aaa/rs/ga/v1 -> com.example.MyApplication doesn't seem to work on the 2.7.x . I am running it on TomEE 1.7.3 and I'm not explicitly defining it to be CXF servlet, if it makes difference. > CXF 3.0 ApplicationPath issue with JAX-RS > ----------------------------------------- > > Key: CXF-5702 > URL: https://issues.apache.org/jira/browse/CXF-5702 > Project: CXF > Issue Type: Bug > Components: JAX-RS > Affects Versions: 3.0.0-milestone2 > Environment: Windows > Reporter: Kou, Zhi Qiang > Assignee: Sergey Beryozkin > Priority: Minor > Fix For: 3.0.0 > > > It seems CXF JAX-RS implementation has something wrong with the relationship > between defined servlet-mapping and the value of ApplicationPath annotation. > From JSR-339 spec, section 2.3.2: If the Application subclass is annotated > with @ApplicationPath, implementations are REQUIRED to use the value of this > annotation appended with ”/*” to define a mapping for the added server. > Otherwise, the application MUST be packaged with a web.xml that specifies a > servlet mapping. > Also from ApplicationPath javadoc: > Identifies the application path that serves as the base URI for all resource > URIs provided by Path. May only be applied to a subclass of Application. > *When published in a Servlet container, the value of the application path may > be overridden using a servlet-mapping element in the web.xml.* > https://jsr311.java.net/nonav/javadoc/javax/ws/rs/ApplicationPath.html > From above information, if both servlet-mapping in web.xml and > ApplicationPath has value, only one of them should be used as the base URI, > and it should be the value of servlet-mapping in web.xml. > In my application, my web.xml looks like below. There are two servlet > defined, each for one jaxrs application. And the servlet-mapping values are > defined as "/first/" and "/second/". > {quote} > <servlet> > <servlet-name>rest1</servlet-name> > > <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class> > <init-param> > <param-name>javax.ws.rs.Application</param-name> > > <param-value>com.ibm.sample.jaxrs.UserDemoApplication</param-value> > </init-param> > </servlet> > <servlet> > <servlet-name>rest2</servlet-name> > > <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class> > <init-param> > <param-name>javax.ws.rs.Application</param-name> > > <param-value>com.ibm.sample.jaxrs.GroupDemoApplication</param-value> > </init-param> > </servlet> > <servlet-mapping> > <servlet-name>rest1</servlet-name> > <url-pattern>/first/*</url-pattern> > </servlet-mapping> > <servlet-mapping> > <servlet-name>rest2</servlet-name> > <url-pattern>/second/*</url-pattern> > </servlet-mapping> > {quote} > And in my application classes: > {quote} > @ApplicationPath("userdemo") > public class UserDemoApplication extends javax.ws.rs.core.Application { > @ApplicationPath("groupdemo") > public class GroupDemoApplication extends javax.ws.rs.core.Application { > {quote} > So in this case according to spec and javadoc, "/first/" and "/second/" > should be used as the base URI, but not the "userdemo" and "groupdemo" or > BOTH. > But in my CXF application I can only access the resources via URLs: > http://localhost:9080/SingleParameterCxf/first/userdemo/users/eric > http://localhost:9080/SingleParameterCxf/second/groupdemo/groups/root > However if I implement the same application using Jersey RI libs, I can > access my resources via URLs: > http://localhost:9080/SingleParameterJersey/first/users/eric > http://localhost:9080/SingleParameterJersey/second/groups/root > My feeling is Jersey RI implementation is correct behavior according to SPEC > and JavaDoc. Please let me know if my understanding is correct or not. > Any help is highly appreciated! Thank you! -- This message was sent by Atlassian JIRA (v6.3.4#6332)