CXF-Servlet initial startup - java

I have got a really basic and important question to you: My CXFServlet which is controlled by an EmbeddedTomcat deploys the webservices, when I call the url to my servlet.
How can I change that? Are there any solutions?

Use <load-on-startup>1</load-on-startup> in web.xml:
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<init-param>
<param-name>config-location</param-name>
<param-value>classpath:cxf-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

Related

Servlet mapping for specific URL not working in Jersey 2

I am trying to use Jersey 2.x and have a servlet call "myapp", configuration on web.xml is as follows:
<servlet>
<servlet-name>myapp</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
com.private.myapp.resource
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
and have a servlet mapping as follows
<servlet-mapping>
<servlet-name>myapp</servlet-name>
<url-pattern>/instance/create</url-pattern>
<url-pattern>/instance/list</url-pattern>
</servlet-mapping>
when I request to $SERVER_ROOT/instance/create or $SERVER_ROOT/instance/list its return 404
but when I change servlet mapping as follows
<servlet-mapping>
<servlet-name>myapp</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
then requesting to $SERVER_ROOT/instance/create or $SERVER_ROOT/instance/list response as expected
can anyone tell what I am missing?

Jersey with liferay, Servlet to portlet conversion

I have a webservlet with Jersey rest API configured. Now I have to convert the servlet to a liferay portlet. How to convert? Like what portlet-class should I specify in my portlet.xml? The below is the web.xml of my servlet.
<servlet>
<servlet-name>charts</servlet-name>
<!--<servlet-class>javax.servlet.http.HttpServlet</servlet-class>-->
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.charts.api.service</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>charts</servlet-name>
<url-pattern>/charts</url-pattern>
<url-pattern>/charts/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
How to configure my portlet.xml and use rest service with my portal? I have to deploy the portlet in liferay jboss server as well.
Why don't you use a delegate servlet in liferay?
You can create a liferay portlet and in web.xml define your delegate servlet.
Here you've got a definition example:
<servlet>
<servlet-name>buscador</servlet-name>
<servlet-class>com.liferay.portal.kernel.servlet.PortalDelegateServlet</servlet-class>
<init-param>
<param-name>servlet-class</param-name>
<param-value>com.dummy.servlet.BuscadorServlet</param-value>
</init-param>
<init-param>
<param-name>sub-context</param-name>
<param-value>buscador</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
It will listens on http://yourliferay/delegate/buscador
Hope it helps

How does Java servlet handle a URL that ends with '/'?

Usually, these two requests:
localhost:8080/test
localhost:8080/test/
have no difference.
However, when I add a servlet-mapping config:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
then
localhost:8080/test/
Does not work, it would return 404 error, I don't understand that I had added a config like this:
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/rest-servlet.xml,
/WEB-INF/interceptor-servlet.xml,
/WEB-INF/controller-servlet.xml,
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
So, why would the request not go to this servlet, what is the magic in *.html? The others like *.txt, *.jpeg would not cause this problem.
remove
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
leave
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
and let Spring distinguish between rest and html requests.

Add multiple endpoint / service classes using apache cxf

I am trying to implement rest webservice using apache cxf (non-spring). I have configured my web.xml and added one end-point address, it works fine but now i want to add one more end-point address or one more service class and I am unable to do it because the second one overrides the first one.
My web.xml like this
<servlet>
<display-name>CXFNonSpringJaxrsServlet</display-name>
<servlet-name>CXFNonSpringJaxrsServlet</servlet-name>
<servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
<init-param>
<param-name>jaxrs.serviceClasses</param-name>
<param-value>abc</param-value>
</init-param>
<init-param>
<param-name>jaxrs.address</param-name>
<param-value>/abc</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<display-name>CXFNonSpringJaxrsServlet</display-name>
<servlet-name>CXFNonSpringJaxrsServlet</servlet-name>
<servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
<init-param>
<param-name>jaxrs.serviceClasses</param-name>
<param-value>xyz</param-value>
</init-param>
<init-param>
<param-name>jaxrs.address</param-name>
<param-value>/xyz</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
You can do like this to have multiple endpoints:
web.xml
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>
org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet
</servlet-class>
<init-param>
<param-name>jaxrs.serviceClasses</param-name>
<!-- Multiple resource classes separated with space -->
<param-value>
com.gsdev.Resource1 com.gsdev.Resource2
com.ttdev.bs.BookSelectionsResource
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
Resource classes will be like:
#Path("endpoint1/")
public class Resource1
#Path("endpoint2/")
public class Resource2
Now you have different endpoints as
http://host:port/webapp/services/endpoint1/
http://host:port/webapp/services/endpoint2/

I can't add a Servlet on my project

I'm trying to add a servlet on my project. But it seems not to work.
The first, I inserted the and tags in web.xml file.
And the I tried to accesss the address "/App/newrmt?~~". But the browser showed 404 error message.
I think the system don't recognize the mapping pattern I described.
Is there anything I should do to add a new servlet and a pattern before insert tags in web.xml files?
It's original web.xml code is below.
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>HttpReceiver</servlet-name>
<servlet-class>myProject.HttpReceiver</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>RmtlImg</servlet-name>
<servlet-class>myProject.ImageServlet</servlet-class>
<init-param>
<param-name>dir</param-name>
<param-value>/APP/WAS/FILES/A/</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HttpReceiver</servlet-name>
<url-pattern>*.http</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RmtlImg</servlet-name>
<url-pattern>/rmtlimgdown</url-pattern>
</servlet-mapping>
Then, I changed the code like below
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>HttpReceiver</servlet-name>
<servlet-class>myProject.HttpReceiver</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>RmtlImg</servlet-name>
<servlet-class>myProject.ImageServlet</servlet-class>
<init-param>
<param-name>dir</param-name>
<param-value>/APP/WAS/FILES/A/</param-value>
</init-param>
</servlet>
**<servlet>
<servlet-name>NewRmtlImg</servlet-name>
<servlet-class>myProject.ImageServlet</servlet-class>
<init-param>
<param-name>dir</param-name>
<param-value>/APP/WAS/FILES/A/</param-value>
</init-param>
</servlet>**
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HttpReceiver</servlet-name>
<url-pattern>*.http</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RmtlImg</servlet-name>
<url-pattern>/rmtlimgdown</url-pattern>
</servlet-mapping>
**<servlet-mapping>
<servlet-name>NewRmtlImg</servlet-name>
<url-pattern>/newrmt</url-pattern>
</servlet-mapping>**
When I change just pattern in the tag like below, It works well. It means servlet-class itself is well coded. Just the WAS don't understand the pattern.
<servlet-mapping>
<servlet-name>NewRmtlImg</servlet-name>
<url-pattern>/newrmt</url-pattern>
</servlet-mapping>
===>
<servlet-mapping>
<servlet-name>NewRmtlImg</servlet-name>
<url-pattern>/rmtlimgdown</url-pattern>
</servlet-mapping>
Anyboday helps me!
When I change just pattern in the tag like below, It works well. It means servlet-class itself is well coded. Just the WAS don't understand the pattern.
It might help you to understand the url-pattern
Servlet Matching Procedure
A request may match more than one servlet-mapping in a given context. The servlet container uses a straightforward matching procedure to determine the best match.
The matching procedure has four simple rules.
First, the container prefers an exact path match over a wildcard path match.
Second, the container prefers to match the longest pattern.
Third, the container prefers path matches over filetype matches.
Finally, the pattern <url-pattern>/</url-pattern> always matches any request that no other pattern matches.
Have a look at my post How does a servlets filter identify next destination is another filter or a servlet/jsp? for detailed description.
I solved this problem.
I found out that I need to change the setting file which is "httpd.conf".
The system has been configured several virtual-host with "MatchExpression".
So what I have to do is to add a single of url-pattern in the config file.
sorry for my bad English.

Categories