I`m using java and eclipse to make a simple rest service. I use jersey 1.19 and jackson 1.7.9. But when i try to run project with tomcat i have this exception.
SEVERE: Servlet [jersey-servlet] in web application [/EmployeeService] threw load() exception
java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:506)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:488)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:115)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1148)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5262)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5550)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Here i will copy the classes and web.xml which i have.
#XmlAccessorType(XmlAccessType.NONE)
#XmlRootElement(name = "employee")
public class Employee {
public String empId;
public String name;
public String email;
#javax.xml.bind.annotation.XmlElement(required = true)
public String getEmpId() {
return empId;
}
public void setEmpId(String empId) {
this.empId = empId;
}
#javax.xml.bind.annotation.XmlElement(required = true)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
#javax.xml.bind.annotation.XmlElement(required = true)
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
#Path("/emp")
public class EmployeeService {
#GET
#Path("/get/{empId}")
public Employee getEmployee(#PathParam("empId") String empId) {
Employee employee = new Employee();
employee.setEmpId(empId);
employee.setName("Nikola");
employee.setEmpId("nikola#nikola.com");
return employee;
}
#POST
#Path("/create")
#Consumes(MediaType.APPLICATION_JSON)
#Produces(MediaType.APPLICATION_XML)
public Employee createEmployee(Employee employee) {
// create logic goes here
return employee;
}
#PUT
#Path("/update")
#Consumes(MediaType.APPLICATION_JSON)
#Produces(MediaType.APPLICATION_JSON)
public Employee updateEmployee(Employee employee) {
// create logic goes here
employee.setName(employee.getName() + "updated");
return employee;
}
#DELETE
#Path("/delete/{empId}")
public javax.ws.rs.core.Response deleteEmployee(#PathParam("empId") int empId) throws URISyntaxException {
return javax.ws.rs.core.Response.status(200).entity("Employee with " + empId + "is deleted successfully").build();
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
EmployeeProvider
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
<servlet>
<servlet-name>jersey-servlet</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>com.rest.employee</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
I had same issue. I put all jar into referenced libraries. but you have to Just copy-paste all required jar files into WEB-INF/lib folder. Problem solved.
We get this error because of build path issue.You should add "Server Runtime" libraries in Build Path.
"java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer"
Please follow below steps to resolve class not found exception.
Right click on project --> Build Path --> Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0
and yeah, remove load on startup tag.
It should work fine.
you should remove this on your web.xml
<load-on-startup>1</load-on-startup>
I understand that you have added the jersey-servlet-1.19.jar but is it in your build path?
Related
I am trying to build a simple Restful api which returns user details.
I have refered this link.
Following are my classes:
API Service class:
package com.demoapp;
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;
import org.omg.Messaging.SyncScopeHelper;
#Path("/AddUserApi")
public class AddUserApi {
#GET
#Path("/users")
#Produces(MediaType.APPLICATION_XML)
public List<User> getUsers(){
return UserUtil.getUserList();
}
}
Dao Class:
package com.demoapp;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
#XmlRootElement(name = "user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
String name="";
String u_name="";
String password="";
String email="";
String user_type="";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getU_name() {
return u_name;
}
public void setU_name(String u_name) {
this.u_name = u_name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUser_type() {
return user_type;
}
public void setUser_type(String user_type) {
this.user_type = user_type;
}
}
Utils class:
package com.demoapp;
import java.util.List;
public class UserUtil {
public static String mysql_ip="jdbc:mysql://10.119.32.86/";
public static String metadata_database="haas";
public static String mysql_username="root";
public static String mysql_password="";
public static List<User> getUserList(){
List<User> users=new ArrayList<User>();
User user=new User();
user.setName("abc");
user.setU_name("ab_c");
user.setPassword("1234");
user.setUser_type("normal");
user.setEmail("abc#gmail.com");
users.add(user);
return users;
}
}
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>UserAPI</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<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.demoapp</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey RESTful Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
I have downloaded the jersey jar from the site and extracted 3 folders and added those jars in build path.
I have done everything according to the tutorial.
Still its showing this error:
Could you please suggest a way of solving this issue?
Provided the server is up and running and the application is deployed without errors, your endpoint should be available in the following URL:
http://[host]:[port]/[context]/rest/AddUserApi/users
Where:
[context] is the name of your WAR file (without the .war extension).
/rest comes from the web.xml: <url-pattern>/rest/*</url-pattern>.
/AddUserApi comes from the #Path annotation on the AddUserApi class.
/users comes from #Path annotation on the getUsers() method.
Your URL should be: localhost:8082/UserAPI/rest/AddUserApi/users
I'm getting this error: MessageBodyWriter not found for media type=application/json, type=class SalesService.Item, genericType=class SalesService.Item.
What I want to do is let my restful service method return a custom object, in this case object: Item. But im getting this error and in the browser error 500.
Im using JAX-RS version 2.25.1 libraries in netbeans
I know there are allot of questions like this but i could not find any solution that worked exactly for me.
Thanks in advance!
WEB.XML
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>examples.rest.school</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.packages</param-name>
<param-value>SalesService</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Resources Service class:
package SalesService;
import java.util.ArrayList;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import DB.DBConnecter;
import javax.ws.rs.PathParam;
import java.util.List;
import javax.ws.rs.Consumes;
#Path("Sales")
#Consumes(MediaType.APPLICATION_JSON)
#Produces(MediaType.APPLICATION_JSON)
public class SalesResources {
private final DBConnecter dbConnector;
public SalesResources() {
dbConnector = new DBConnecter();
}
#GET
#Path("session/{sessionID}")
#Produces(MediaType.APPLICATION_JSON)
public Item GetItem(#PathParam("sessionID") String sessionID) {
List<Item> items = new ArrayList<>();
if(dbConnector.CheckSessionID(sessionID)){
items = dbConnector.GetItems();
return items.get(0);
}
return new Item();
}
}
Item class:
package SalesService;
import javax.xml.bind.annotation.XmlRootElement;
#XmlRootElement
public class Item {
private int id;
private String name;
private int quantity;
private double price;
private String type;
public Item(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void AddQuantity() {
this.quantity = quantity + 1;
}
public void RemoveQuantity() {
this.quantity = quantity - 1;
}
public Item(int id, String name, int quantity, double price, String type) {
this.id = id;
this.name = name;
this.quantity = quantity;
this.price = price;
this.type = type;
}
}
StackTrace
04-Mar-2017 21:03:06.273 SEVERE [http-nio-8080-exec-1] org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter not found for media type=application/json, type=class SalesService.Item, genericType=class SalesService.Item.
This was resolved adding
org.codehaus.jackson.jaxrs
In web.xml like this
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>examples.rest.school</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.packages</param-name>
<param-value>SalesService,org.codehaus.jackson.jaxrs</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
After adding 4 jackson .JAR files which are these
And also adding them in libraries folder (reference)
Hello all i have sample restful service below with jersey 2
MODEL Class
#XmlRootElement(name = "book")
#XmlType(propOrder = { "id", "name", "author", "price" })
public class Book {
private String id;
private String name;
private String price;
private String author;
public Book() {
}
public Book(String id, String name, String price, String author) {
super();
this.id = id;
this.name = name;
this.price = price;
this.author = author;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
My DAOImpl
public class BooksImpl{
static Connection conn = null;
static Statement stmt;
ResultSet rs;
public List<Book> getAllBooks() throws SQLException, ClassNotFoundException, FileNotFoundException {
getConnection();
List<Book> arrBook = new ArrayList<Book>();
rs = stmt.executeQuery(GET_ALL_BOOKS);
while (rs.next()) {
arrBook.add(new Book(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4)));
}
rs.close();
stmt.close();
conn.close();
return arrBook;
}
Service
#Path("/library")
#Produces({ MediaType.APPLICATION_JSON + ";charset=UTF-8",MediaType.APPLICATION_XML + ";charset=utf-8" })
#Consumes({ MediaType.APPLICATION_JSON + ";charset=UTF-8",MediaType.APPLICATION_XML + ";charset=utf-8" })
public class BookServiceImpl implements BookService {
private BooksImpl booksImpl = new BooksImpl();
#GET
public Response getBooks(#QueryParam("format") String format) throws SQLException, ClassNotFoundException, FileNotFoundException {
return Response.status(Status.OK).entity(new GenericEntity<List<Book>>(booksImpl.getAllBooks()) {
}).header(HttpHeaders.CONTENT_TYPE, "XML".equalsIgnoreCase(format)
? MediaType.APPLICATION_XML + ";charset=UTF-8" : MediaType.APPLICATION_JSON + ";charset=UTF-8")
.status(Status.OK).build();
}
So finally i make a get request say in a postman like ::
http://localhost:8080/BooksJAXRS/library
It's good and i can get the reponse by getting all the books from DB.
my web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>BooksJAXRS</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>jersey-servlet</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.library.books</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
My requriment is for different http methods we have different url end point paths for example
GET : http://localhost:8080/BooksJAXRS/library
POST : http://localhost:8080/BooksJAXRS/library
DELETE : http://localhost:8080/BooksJAXRS/library/1
PUT : http://localhost:8080/BooksJAXRS/library/1
So i make a props file
GET=http://localhost:8080/BooksJAXRS/library
POST=http://localhost:8080/BooksJAXRS/library
DELETE= http://localhost:8080/BooksJAXRS/library/1
PUT= http://localhost:8080/BooksJAXRS/library/1
Now i want to capture that restful url and pass it through props file and route it accordingly depending on the method and url
Thank you
Mark
You could create 2 mappings on 2 different methods that call the same private method like this:
#Path("/")
...
public class BookServiceImpl implements BookService {
#Path("/")
#GET
public Response getBooksByRoot(#QueryParam("format") String format) {
return getBooks(format);
}
#Path("/library")
#GET
public Response getBooksByLibrary(#QueryParam("format") String format) {
return getBooks(format);
}
private Response getBooks(String format) {
...
}
#Path("/library")
#POST
public Response createBook(#QueryParam("name") String name) {
...
}
Response Update:
It seems that you want a dynamic mapping, so you need to use a Path with a regular expression.
#Path("/")
...
public class BookServiceImpl implements BookService {
#Path("/{parameter:.*}")
#GET
public Response getBooks(#PathParam("parameter") String parameter) {
if (properties.getProperty("GET").endsWith(parameter) {
// code to get the books here
} else {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
WARNING: The code snippet above is only meant to show the idea, it is not meant to be perfect. For example testing with endsWith could not be enough according to your context.
When using standard web descriptor (url-pattern /*) and annotated end-points (#Path /library) there is not so much that can be done for dynamic (at runtime) routing at this points. If you want or need some dynamic routes, one option put the "app" into a new context like:
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
And add some standard Servlet to forward to your desired end-points:
<servlet>
<servlet-name>route</servlet-name>
<servlet-class>my.package.Route</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>route</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
my.package.Route will be get hit on any other than /app/* request and you can do your routing to forward the request anywhere.
I'm trying to send JSON data to my RESTful web service. Configuration is working fine for a simple GET type. Only the issue is for POST type.
My Angular code
var app = angular.module('myApp', []);
app.controller('MyController', function($scope,$http) {
$scope.pushDataToServer = function() {
$http({
method: 'POST',
url: 'rest/Board/autoSave',
headers: {'Content-Type': 'application/json'},
data:'{"firstName":"Syed", "lastName":"Chennai"}',
}).success(function (data){
$scope.status=data;
}).error(function(data, status, headers, config) {
alert("error");
});
};
});
My Java code
#Path("/Board")
public class BoardAutoSaveService {
#POST
#Path("/autoSave")
#Consumes({MediaType.APPLICATION_JSON})
#Produces({MediaType.TEXT_PLAIN})
public String autoSave(Message msg) throws Exception{
System.out.println("Calling Autosave.");
System.out.println("First Name = "+msg.getFirstName());
System.out.println("Last Name = "+msg.getLastName());
return null;
}
}
Message class
package com.intu;
import java.util.Date;
public class Message {
private String firstName;
private String lastName;
private int age;
private Date date;
private String text;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
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" version="3.0">
<display-name>iNTU-1</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Jersey RESTful Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.dao</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey RESTful Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Am I missing anything?
The error is
SEVERE: A message body reader for Java class com.intu.Message, and Java type class com.intu.Message, and MIME media type application/json was not found.
The registered message body readers compatible with the MIME media type are:
application/json ->
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->
You only have the default Jersey JSON providers, which require #XmlRootElement on your model class. You can see the available providers, one of which is the JSON**RootElement**Provider
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
This provider is used to (de)serialize classes annotated with #XmlRootElement.
If you have the following dependency
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>${jersey.version}</version>
</dependency>
then it should also pull in the Jackson provider, which doesn't require #XmlRootElement, but you still need to configure Jersey to use Jackson instead of its default provider. To configure it you need to add this to your web.xml Jersey servlet configuration, as seen here
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Or if you are not using a web.xml, add the following inside your ResourceConfig subclass constructor
public class AppConfig extends PackagesResourceConfig{
public AppConfig() {
getProperties().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
}
}
I am trying to learn simple restful web services. So, I looked up an example and followed it step by step but I am stuck with Error 404 when trying to deploy the project. Any idea why?
File: 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>UserManagement</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>
File: User.java:
package com.tutorialspoint;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
#XmlRootElement(name = "user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private String profession;
public User(){}
public User (int id, String name, String profession){
this.id = id;
this.name = name;
this.profession = profession;
}
public int getID(){
return id;
}
#XmlElement
public void setId (int id){
this.id = id;
}
public String getName(){
return name;
}
#XmlElement
public void setName(String name){
this.name = name;
}
public String getProfession(){
return profession;
}
#XmlElement
public void setProfession(String profession){
this.profession = profession;
}
}
File: UserDao.java
package com.tutorialspoint;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
#SuppressWarnings("unchecked")
public List<User> getAllUsers(){
List<User> userList = null;
try {
File file = new File("Users.dat");
if (!file.exists()) {
User user = new User(1, "Mahesh", "Developer");
userList = new ArrayList<User>();
userList.add(user);
saveUserList(userList);
}
else {
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
userList = (List<User>) ois.readObject();
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e){
e.printStackTrace();
}
return userList;
}
private void saveUserList(List<User> userList) {
// TODO Auto-generated method stub
try {
File file = new File ("User.dat");
FileOutputStream fos = new FileOutputStream (file);
ObjectOutputStream oos = new ObjectOutputStream (fos);
oos.writeObject(userList);
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
File: UserService.java
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();
}
}
Here's what I am getting back
Error 404 screenshot
Besides the possibility that your application is not even deployed (also 404):
The path you configured your rest service to answer is
<Your application context>/rest/UserService/users
<Your application context> seems to be /UserManagement.
/rest is configured in your web.xml in the jersey servlet mapping
/UserService is configured in your UserService.java file in the #Path annotation
/users is configured in UserService.java file on the method's #Path annotation. This should be #Path("users").
Your screenshot shows you are calling /UserManagement, which may be the context of your application, but is not the path to your service.
You can change you web.xml file. There is some problem with webxml file. Use this web.xml file use below code.
<?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>