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?
I have been trying (for about a day now) to figure out how to send a #POST request from my client to my web service but I am getting a 403 error and I have no idea why. I have tried editing my web.xml files to allow the correct authorization but it still isn't working. Below are my WEB-INF web.xml and Tomcat web.xml files. Any help would be greatly appreciated, this has been beyond frustrating. Also, I am very new to both Tomcat and Jersey so it very well could be a very stupid/simple error.
Specs
OS X El Capitan 10.11.2
Tomcat Version 7.0 Server
Eclipse JEE Kepler R Cocoa x86_64
Jersey 2.23.1
JRE 1.7
Postman as my client (Google chrome ext)
Server web.xml
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Accept,Accept-Encoding,Accept-Language,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization,Connection,Content-Type,Host,Origin,Referer,Token-Id,User-Agent, X-Requested-With</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET, POST, PUT, DELETE, OPTIONS, HEAD</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
WEB-INF web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Jersey Web Application</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.example.messenger</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>
</web-app>
That should not happen. Your error is handled somewhere. Look these annotations:
#ControllerAdvice
#ResponseStatus(HttpStatus.FORBIDDEN)
#ExceptionHandler(YourException.class)
This example (https://wolfpaulus.com/journal/java-journal/jersey/) has a somewhat altered web.xml:
<display-name>Jersey Web Application</display-name>
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
That example page seems to highlight your exact environment (except the author uses IntelliJ rather than Eclipse... but you can download the community edition for free, and Java 8 rather than 7) - so you may want to follow along with it to get up and running.
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 have setup my application like this using jetty
Web.xml
<servlet>
<servlet-name>GoogleProxy</servlet-name>
<servlet-class>org.mortbay.proxy.AsyncProxyServlet$Transparent</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>ProxyTo</param-name><param-value>http://www.google.com</param-value>
</init-param>
<init-param>
<param-name>Prefix</param-name><param-value>/google</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>GoogleProxy</servlet-name>
<url-pattern>/google/*</url-pattern>
</servlet-mapping>
However when I access my app (The url is like this localhost:8080/myapp/google/images) it returns an error 403. I am using jetty 6.1.13
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>