Whenever I run my test app on Tomcat I can make it to my main page but whenever I try to go to my api/rest path I received a 500 error because my AppConfig could not be found. I believe this has to do with my directory set up.
My xml looks like this
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>FACHybrid</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>java.config.ApplicationConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
</web-app>
In the xml the issues lies with the param-value tag
Here is the ApplicationConfig file
package config;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import service.TestService;
#ApplicationPath("/rest")
public class ApplicationConfig extends Application{
#Override
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(TestService.class);
return s;
}
}
and my directories look like this
error in console
java.lang.ClassNotFoundException: java.config.ApplicationConfig
I think the problem lies in your web.xml. Fully qualified name of ApplicationConfig class is wrong.
Change it to config.ApplicationConfig -
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>config.ApplicationConfig</param-value>
</init-param>
Related
Somehow it doesn't work properly
If I am right it should be possible to call showLogin() using projectURI/rest/application/login
But somehow it doesn't work out that way. I guess something went wrong in here/
ApplicationController:
package de.tc;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
#Path("/application")
public class ApplicationController {
#GET
#Path("/login")
public Response showLogin() {
String output = "login";
System.out.println("called");
return Response.status(200).entity(output).build();
}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>application</display-name>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<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>de.tc</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
a URL need to look like:
domain/nameOfProject/rest/pathOfServlet
example http://localhost:8080/HelloWorldProject/rest/application/login
please try to remove the "/" in your path annotation.
you wrote:
#Path("/application")
#Path("/login")
try:
#Path("application")
#Path("login")
please dont forget:
configure your project by server->"add and remove".
before trying to call a Servlet, you must start the server(like tomcat).
I am trying one restful web service example so when I am going to hit url that time I am getting HTTP Status 404 - The requested resource is not available
below are the detail of my code, if you want any other information let me know
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>User Management</display-name>
<servlet>
<servlet-name>Jersey RESTful 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.tutorialspoint</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey RESTful Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Service class
package com.tutorialspoint;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
#Path("/UserService")
public class UserService {
UserDao userDao = new UserDao();
#GET
#Path("/users")
#Produces(MediaType.APPLICATION_XML)
public List<User> getUsers(){
return userDao.getAllUsers();
}
}
ALL jars
Tomcat webapps
Obviously, your URL shoud be http://localhost:8080/UserManagement/rest/UserService/users.
Also you can try to delete * in <url-pattern>/rest/*</url-pattern>
This issue has been resolved,
Actually my web.xml was not on correct place that is why I was getting the "The requested resource is not available" . The file web.xml should be placed inside WEB-INF folder
I had the same error. I correct it with modifying the web.xml, when decalring the servlet.
<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>org.webservice.messenger.ressources</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
My package was declared :
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>org.webservice.messenger.messengers</param-value>
</init-param>
while my classes were on package : org.webservice.messenger.ressources
I hope it s clear now.
I am using JERSEY2.15:-
java class:-
package packages.newJersey;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
#Path("/rest")
public class SimpleWebService {
private static String versions = "4.1";
#GET
#Produces(MediaType.TEXT_HTML)
public String simpleMessage() {
return "<p>This is a simple REST</p>";
}
#Path("/version")
#GET
#Produces(MediaType.TEXT_HTML)
public String version() {
return "<p>Version Number:</p> " + versions;
}
}
web.xml:-
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>LatestJersey</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.package</param-name>
<param-value>packages.newJersey</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
</web-app>
even though i use display name as :- LatestJersey
by default tomcat is opening:-
http://localhost:8080/RESTFULServiceWithLatestJersey/
and when i hit:-
http://localhost:8080/RESTFULServiceWithLatestJersey/hello/rest
I AM GETTING 404 ERROR
Could someone please help me here?
Everything looks good, except for this
jersey.config.server.provider.package
It should be
jersey.config.server.provider.packages
You're missing the s
I am creating a RESTful web service with jersey 2.0, here is my web.xml file:
<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>Rest</servlet-name>
<servlet-class>
com.shop.domain.ShoppingApplication
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Rest</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
My ShoppingApplication class:
public class ShoppingApplication extends Application {
#Override
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(CustomerResource.class);
return s;
}
}
And my CustomerResource class:
#Path("/customers")
public class CustomerResource{
#GET
#Produces(MediaType.TEXT_PLAIN)
public String getCustomer(){
return "Hello";
}
}
When running with localhost:8080/customers, I got a 404 not found page, how should I fix it.
Using JAX-RS inside a non-JEE6 container requires you to provide a JAX-RS Servlet (like Jersey) to be mapped within your web.xml
Change your web.xml to
<web-app>
<servlet>
<servlet-name>MyApplication</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.shop.domain.ShoppingApplication</param-value>
</init-param>
</servlet>
...
<servlet-mapping>
<servlet-name>MyApplication</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
...
</web-app>
See https://jersey.java.net/documentation/latest/deployment.html#deployment.servlet.2 for docs.
I'm facing Jersey 2.7. This is my service:
package edu.srv.rest;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Application;
#Path("/algebra")
public class Algebra extends Application {
#GET
#POST
#Path("/sum")
public int sum(#QueryParam("a") int a, #QueryParam("b") int b) {
return a + b;
}
}
this is my web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>RS1</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>edu.srv.rest.Algebra</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RS1</servlet-name>
<url-pattern>/algebra/*</url-pattern>
</servlet-mapping>
</web-app>
and this is my project structure:
when I try to deploy (tomcat 6, tomcat 7, tomcat 8) this service as war I got this exception:
java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.model.ContractProvider$Builder
what am I missing?
org.glassfish.jersey.model.ContractProvider$Builder uses javax.inject.Singleton class which is present in javax.inject jar. Include the same to resolve the issue.