RestEasy Tutorial, CRUD Services example

This commit is contained in:
giuseppe.bueti 2016-01-30 17:48:56 +01:00
parent 333e8793bd
commit a0c22cc225
12 changed files with 979 additions and 0 deletions

91
RestEasy Example/pom.xml Normal file
View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung</groupId>
<artifactId>resteasy-tutorial</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<repositories>
<repository>
<id>jboss</id>
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
</repository>
</repositories>
<properties>
<resteasy.version>3.0.14.Final</resteasy.version>
<resteasy.scope>runtime</resteasy.scope>
</properties>
<build>
<finalName>RestEasyTutorial</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- core library -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
<version>3.0.12.Final</version>
<scope>${resteasy.scope}</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>${resteasy.version}</version>
<scope>${resteasy.scope}</scope>
<exclusions>
<exclusion>
<artifactId>jboss-jaxrs-api_2.0_spec</artifactId>
<groupId>org.jboss.spec.javax.ws.rs</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>${resteasy.version}</version>
<scope>${resteasy.scope}</scope>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>${resteasy.version}</version>
<scope>${resteasy.scope}</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>${resteasy.version}</version>
<scope>${resteasy.scope}</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,535 @@
package com.baeldung;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "movie", propOrder = {
"actors",
"awards",
"country",
"director",
"genre",
"imdbID",
"imdbRating",
"imdbVotes",
"language",
"metascore",
"plot",
"poster",
"rated",
"released",
"response",
"runtime",
"title",
"type",
"writer",
"year"
})
public class Movie {
protected String actors;
protected String awards;
protected String country;
protected String director;
protected String genre;
protected String imdbID;
protected String imdbRating;
protected String imdbVotes;
protected String language;
protected String metascore;
protected String plot;
protected String poster;
protected String rated;
protected String released;
protected String response;
protected String runtime;
protected String title;
protected String type;
protected String writer;
protected String year;
/**
* Recupera il valore della propriet<EFBFBD> actors.
*
* @return
* possible object is
* {@link String }
*
*/
public String getActors() {
return actors;
}
/**
* Imposta il valore della propriet<EFBFBD> actors.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setActors(String value) {
this.actors = value;
}
/**
* Recupera il valore della propriet<EFBFBD> awards.
*
* @return
* possible object is
* {@link String }
*
*/
public String getAwards() {
return awards;
}
/**
* Imposta il valore della propriet<EFBFBD> awards.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setAwards(String value) {
this.awards = value;
}
/**
* Recupera il valore della propriet<EFBFBD> country.
*
* @return
* possible object is
* {@link String }
*
*/
public String getCountry() {
return country;
}
/**
* Imposta il valore della propriet<EFBFBD> country.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setCountry(String value) {
this.country = value;
}
/**
* Recupera il valore della propriet<EFBFBD> director.
*
* @return
* possible object is
* {@link String }
*
*/
public String getDirector() {
return director;
}
/**
* Imposta il valore della propriet<EFBFBD> director.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setDirector(String value) {
this.director = value;
}
/**
* Recupera il valore della propriet<EFBFBD> genre.
*
* @return
* possible object is
* {@link String }
*
*/
public String getGenre() {
return genre;
}
/**
* Imposta il valore della propriet<EFBFBD> genre.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setGenre(String value) {
this.genre = value;
}
/**
* Recupera il valore della propriet<EFBFBD> imdbID.
*
* @return
* possible object is
* {@link String }
*
*/
public String getImdbID() {
return imdbID;
}
/**
* Imposta il valore della propriet<EFBFBD> imdbID.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setImdbID(String value) {
this.imdbID = value;
}
/**
* Recupera il valore della propriet<EFBFBD> imdbRating.
*
* @return
* possible object is
* {@link String }
*
*/
public String getImdbRating() {
return imdbRating;
}
/**
* Imposta il valore della propriet<EFBFBD> imdbRating.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setImdbRating(String value) {
this.imdbRating = value;
}
/**
* Recupera il valore della propriet<EFBFBD> imdbVotes.
*
* @return
* possible object is
* {@link String }
*
*/
public String getImdbVotes() {
return imdbVotes;
}
/**
* Imposta il valore della propriet<EFBFBD> imdbVotes.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setImdbVotes(String value) {
this.imdbVotes = value;
}
/**
* Recupera il valore della propriet<EFBFBD> language.
*
* @return
* possible object is
* {@link String }
*
*/
public String getLanguage() {
return language;
}
/**
* Imposta il valore della propriet<EFBFBD> language.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setLanguage(String value) {
this.language = value;
}
/**
* Recupera il valore della propriet<EFBFBD> metascore.
*
* @return
* possible object is
* {@link String }
*
*/
public String getMetascore() {
return metascore;
}
/**
* Imposta il valore della propriet<EFBFBD> metascore.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setMetascore(String value) {
this.metascore = value;
}
/**
* Recupera il valore della propriet<EFBFBD> plot.
*
* @return
* possible object is
* {@link String }
*
*/
public String getPlot() {
return plot;
}
/**
* Imposta il valore della propriet<EFBFBD> plot.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setPlot(String value) {
this.plot = value;
}
/**
* Recupera il valore della propriet<EFBFBD> poster.
*
* @return
* possible object is
* {@link String }
*
*/
public String getPoster() {
return poster;
}
/**
* Imposta il valore della propriet<EFBFBD> poster.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setPoster(String value) {
this.poster = value;
}
/**
* Recupera il valore della propriet<EFBFBD> rated.
*
* @return
* possible object is
* {@link String }
*
*/
public String getRated() {
return rated;
}
/**
* Imposta il valore della propriet<EFBFBD> rated.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setRated(String value) {
this.rated = value;
}
/**
* Recupera il valore della propriet<EFBFBD> released.
*
* @return
* possible object is
* {@link String }
*
*/
public String getReleased() {
return released;
}
/**
* Imposta il valore della propriet<EFBFBD> released.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setReleased(String value) {
this.released = value;
}
/**
* Recupera il valore della propriet<EFBFBD> response.
*
* @return
* possible object is
* {@link String }
*
*/
public String getResponse() {
return response;
}
/**
* Imposta il valore della propriet<EFBFBD> response.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setResponse(String value) {
this.response = value;
}
/**
* Recupera il valore della propriet<EFBFBD> runtime.
*
* @return
* possible object is
* {@link String }
*
*/
public String getRuntime() {
return runtime;
}
/**
* Imposta il valore della propriet<EFBFBD> runtime.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setRuntime(String value) {
this.runtime = value;
}
/**
* Recupera il valore della propriet<EFBFBD> title.
*
* @return
* possible object is
* {@link String }
*
*/
public String getTitle() {
return title;
}
/**
* Imposta il valore della propriet<EFBFBD> title.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setTitle(String value) {
this.title = value;
}
/**
* Recupera il valore della propriet<EFBFBD> type.
*
* @return
* possible object is
* {@link String }
*
*/
public String getType() {
return type;
}
/**
* Imposta il valore della propriet<EFBFBD> type.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setType(String value) {
this.type = value;
}
/**
* Recupera il valore della propriet<EFBFBD> writer.
*
* @return
* possible object is
* {@link String }
*
*/
public String getWriter() {
return writer;
}
/**
* Imposta il valore della propriet<EFBFBD> writer.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setWriter(String value) {
this.writer = value;
}
/**
* Recupera il valore della propriet<EFBFBD> year.
*
* @return
* possible object is
* {@link String }
*
*/
public String getYear() {
return year;
}
/**
* Imposta il valore della propriet<EFBFBD> year.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setYear(String value) {
this.year = value;
}
}

View File

@ -0,0 +1,44 @@
package com.baeldung.client;
import com.baeldung.Movie;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public interface ServicesInterface {
@GET
@Path("/getinfo")
@Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
Movie movieByImdbID(@QueryParam("imdbID") String imdbID);
@POST
@Path("/addmovie")
@Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
Response addMovie(Movie movie);
@PUT
@Path("/updatemovie")
@Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
Response updateMovie(Movie movie);
@DELETE
@Path("/deletemovie")
Response deleteMovie(@QueryParam("imdbID") String imdbID);
@GET
@Path("/listmovies")
@Produces({"application/json"})
List<Movie> listMovies();
}

View File

@ -0,0 +1,94 @@
package com.baeldung.server.service;
import com.baeldung.Movie;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Path("/movies")
public class MovieCrudService {
private Map<String,Movie> inventory = new HashMap<String, Movie>();
@GET
@Path("/getinfo")
@Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public Movie movieByImdbID(@QueryParam("imdbID") String imdbID){
System.out.println("*** Calling getinfo ***");
Movie movie=new Movie();
movie.setImdbID(imdbID);
return movie;
}
@POST
@Path("/addmovie")
@Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public Response addMovie(Movie movie){
System.out.println("*** Calling addMovie ***");
if (null!=inventory.get(movie.getImdbID())){
return Response.status(Response.Status.NOT_MODIFIED)
.entity("Movie is Already in the database.").build();
}
inventory.put(movie.getImdbID(),movie);
return Response.status(Response.Status.CREATED).build();
}
@PUT
@Path("/updatemovie")
@Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public Response updateMovie(Movie movie){
System.out.println("*** Calling updateMovie ***");
if (null!=inventory.get(movie.getImdbID())){
return Response.status(Response.Status.NOT_MODIFIED)
.entity("Movie is not in the database.\nUnable to Update").build();
}
inventory.put(movie.getImdbID(),movie);
return Response.status(Response.Status.OK).build();
}
@DELETE
@Path("/deletemovie")
public Response deleteMovie(@QueryParam("imdbID") String imdbID){
System.out.println("*** Calling deleteMovie ***");
if (null==inventory.get(imdbID)){
return Response.status(Response.Status.NOT_FOUND)
.entity("Movie is not in the database.\nUnable to Delete").build();
}
inventory.remove(imdbID);
return Response.status(Response.Status.OK).build();
}
@GET
@Path("/listmovies")
@Produces({"application/json"})
public List<Movie> listMovies(){
return inventory.values().stream().collect(Collectors.toCollection(ArrayList::new));
}
}

View File

@ -0,0 +1,40 @@
package com.baeldung.server.service;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Created by Admin on 29/01/2016.
*/
@ApplicationPath("/rest")
public class RestEasyServices extends Application {
private Set<Object> singletons = new HashSet<Object>();
public RestEasyServices() {
singletons.add(new MovieCrudService());
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
@Override
public Set<Class<?>> getClasses() {
return super.getClasses();
}
@Override
public Map<String, Object> getProperties() {
return super.getProperties();
}
}

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="movie">
<xs:sequence>
<xs:element name="actors" type="xs:string" minOccurs="0"/>
<xs:element name="awards" type="xs:string" minOccurs="0"/>
<xs:element name="country" type="xs:string" minOccurs="0"/>
<xs:element name="director" type="xs:string" minOccurs="0"/>
<xs:element name="genre" type="xs:string" minOccurs="0"/>
<xs:element name="imdbID" type="xs:string" minOccurs="0"/>
<xs:element name="imdbRating" type="xs:string" minOccurs="0"/>
<xs:element name="imdbVotes" type="xs:string" minOccurs="0"/>
<xs:element name="language" type="xs:string" minOccurs="0"/>
<xs:element name="metascore" type="xs:string" minOccurs="0"/>
<xs:element name="plot" type="xs:string" minOccurs="0"/>
<xs:element name="poster" type="xs:string" minOccurs="0"/>
<xs:element name="rated" type="xs:string" minOccurs="0"/>
<xs:element name="released" type="xs:string" minOccurs="0"/>
<xs:element name="response" type="xs:string" minOccurs="0"/>
<xs:element name="runtime" type="xs:string" minOccurs="0"/>
<xs:element name="title" type="xs:string" minOccurs="0"/>
<xs:element name="type" type="xs:string" minOccurs="0"/>
<xs:element name="writer" type="xs:string" minOccurs="0"/>
<xs:element name="year" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

View File

@ -0,0 +1,3 @@
<configuration scan="true" scanPeriod="10 seconds">
</configuration>

View File

@ -0,0 +1,16 @@
<jboss-deployment-structure>
<deployment>
<exclude-subsystems>
<subsystem name="resteasy" />
</exclude-subsystems>
<exclusions>
<module name="javaee.api" />
<module name="javax.ws.rs.api"/>
<module name="org.jboss.resteasy.resteasy-jaxrs" />
</exclusions>
<local-last value="true" />
</deployment>
</jboss-deployment-structure>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 4.2//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
<jboss-web>
</jboss-web>

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">
<display-name>RestEasy Example</display-name>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<description>RestEasy Example</description>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>RestEasyExample</param-value>
</context-param>
<!-- this need same with resteasy servlet url-pattern -->
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.baeldung.server.service.RestEasyServices</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

View File

@ -0,0 +1,50 @@
package com.baeldung.server;
import com.baeldung.Movie;
import com.baeldung.client.ServicesInterface;
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
import java.util.List;
public class RestEasyClient {
public static void main(String[] args) {
Movie st = new Movie();
st.setImdbID("12345");
/*
* Alternatively you can use this simple String to send
* instead of using a Student instance
*
* String jsonString = "{\"id\":12,\"firstName\":\"Catain\",\"lastName\":\"Hook\",\"age\":10}";
*/
try {
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target("http://localhost:8080/RestEasyTutorial/rest/movies/listmovies");
ServicesInterface simple = target.proxy(ServicesInterface.class);
final List<Movie> movies = simple.listMovies();
/*
if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
System.out.println("Server response : \n");
System.out.println(response.readEntity(String.class));
response.close();
*/
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,22 @@
{
"title": "Transformers",
"year": "2007",
"rated": "PG-13",
"released": "03 Jul 2007",
"runtime": "144 min",
"genre": "Action, Adventure, Sci-Fi",
"director": "Michael Bay",
"writer": "Roberto Orci (screenplay), Alex Kurtzman (screenplay), John Rogers (story), Roberto Orci (story), Alex Kurtzman (story)",
"actors": "Shia LaBeouf, Megan Fox, Josh Duhamel, Tyrese Gibson",
"plot": "A long time ago, far away on the planet of Cybertron, a war is being waged between the noble Autobots (led by the wise Optimus Prime) and the devious Decepticons (commanded by the dreaded Megatron) for control over the Allspark, a mystical talisman that would grant unlimited power to whoever possesses it. The Autobots managed to smuggle the Allspark off the planet, but Megatron blasts off in search of it. He eventually tracks it to the planet of Earth (circa 1850), but his reckless desire for power sends him right into the Arctic Ocean, and the sheer cold forces him into a paralyzed state. His body is later found by Captain Archibald Witwicky, but before going into a comatose state Megatron uses the last of his energy to engrave into the Captain's glasses a map showing the location of the Allspark, and to send a transmission to Cybertron. Megatron is then carried away aboard the Captain's ship. A century later, Captain Witwicky's grandson Sam Witwicky (nicknamed Spike by his friends) buys his first car. To his shock, he discovers it to be Bumblebee, an Autobot in disguise who is to protect Spike, who possesses the Captain's glasses and the map engraved on them. But Bumblebee is not the only Transformer to have arrived on Earth - in the desert of Qatar, the Decepticons Blackout and Scorponok attack a U.S. military base, causing the Pentagon to send their special Sector Seven agents to capture all \"specimens of this alien race.\" Spike and his girlfriend Mikaela find themselves in the midst of a grand battle between the Autobots and the Decepticons, stretching from Hoover Dam all the way to Los Angeles. Meanwhile, deep inside Hoover Dam, the cryogenically stored body of Megatron awakens.",
"language": "English, Spanish",
"country": "USA",
"awards": "Nominated for 3 Oscars. Another 18 wins & 40 nominations.",
"poster": "http://ia.media-imdb.com/images/M/MV5BMTQwNjU5MzUzNl5BMl5BanBnXkFtZTYwMzc1MTI3._V1_SX300.jpg",
"metascore": "61",
"imdbRating": "7.1",
"imdbVotes": "492,225",
"imdbID": "tt0418279",
"Type": "movie",
"response": "True"
}