Wednesday, November 20, 2013


REST Services with RESTEasy + JBOSS 7 Hello world application

Lokesh Gupta+       12 May 2013      FrameworksREST     3 Comments
RESTEasy is JBOSS provided implementation of JAX-RS specification for building RESTful Web Services and RESTful Java applications. Though this is not limited to be used in JBOSS only, and you can use with other servers also. In this post, I am building such a hello world application in JBOSS AS7 server.
Environment used:
  1. RESTEasy 2.3.1.GA
  2. Jboss AS7
  3. JDK 1.6
Follow below steps to build a demo application.
1) Create a maven project and convert to eclipse web project
mvn archetype:generate -DgroupId=com.howtodoinjava -DartifactId=RESTfulDemoApplication 
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

mvn eclipse:eclipse -Dwtpversion=2.0
2) Update runtime dependencies in pom.xml
You need to define only compile time dependencies. Even better, if you can identify and include the jars from jboss distribution package.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.howtodoinjava</groupId>
  <artifactId>RESTfulDemoApplication</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>RESTfulDemoApplication Maven Webapp</name>
  <url>http://maven.apache.org</url>
    <repositories>
        <repository>
          <id>jboss</id>
          <url>http://repository.jboss.org/maven2</url>
        </repository>
    </repositories>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
         <artifactId>resteasy-jaxrs</artifactId>
        <version>2.3.1.GA</version>
        <scope>compile</scope>
    </dependency>
   
   <dependency>
      <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxb-provider</artifactId>
      <version>2.3.1.GA</version>
      <scope>compile</scope>
   </dependency>
   
   <dependency>
      <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-multipart-provider</artifactId>
      <version>2.3.1.GA</version>
      <scope>compile</scope>
   </dependency>
   <dependency>
        <groupId>net.sf.scannotation</groupId>
        <artifactId>scannotation</artifactId>
        <version>1.0.2</version>
        <scope>compile</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>RESTfulDemoApplication</finalName>
  </build>
</project>
3) Create a blank web.xml file
JBOSS’s inbuilt support RESTeasy makes it a perfect combo for RESTFul web application. The minimum configuration to build such application is none. Yes, a blank web.xml file.
?
1
2
3
4
5
6
7
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Restful Web Application</display-name>
</web-app>
5) Register the application path
You will need to extend javax.ws.rs.core.Application class and provide @ApplicationPath annotation.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"http://howtodoinjava.com/wp-content/uploads/jboss+resteasy1.png" alt="JBOSS 7+ RESTEasy demo application" width="453" height="225" class="size-full wp-image-2033" /> JBOSS 7+ RESTEasy demo applicationpackage com.howtodoinjava;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

import com.howtodoinjava.service.UserService;

@ApplicationPath("/")
public class ApplicationConfig extends Application {
    @SuppressWarnings("unchecked")
    public Set> getClasses() {
        return new HashSet>(Arrays.asList(UserService.class));
    }
}
4) Write a service class having @Path annotations
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package com.howtodoinjava.service;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import com.howtodoinjava.model.User;
import com.howtodoinjava.model.Users;

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "user-management")
@Path("/user-management")
public class UserService {
    @XmlElement(name = "users")
    private String uri1 = "/user-management/users";

    @XmlElement(name = "report")
    private String uri2 = "/user-managemet/generate-report";

    public String getUri1() {
        return uri1;
    }

    public void setUri1(String uri1) {
        this.uri1 = uri1;
    }

    public String getUri2() {
        return uri2;
    }

    public void setUri2(String uri2) {
        this.uri2 = uri2;
    }

    @GET
    @Path("/")
    @Produces("application/vnd.com.demo.user-management+xml;charset=UTF-8;version=1")
    public UserService getServiceInfo() {
        return new UserService();
    }

    @GET
    @Path("/users")
    @Produces("application/vnd.com.demo.user-management.users+xml;charset=UTF-8;version=1")
    public Users getAllUsers() {
        User user1 = new User();
        user1.setId(1);
        user1.setFirstName("demo");
        user1.setLastName("user");
        user1.setUri("/user-management/users/1");

        User user2 = new User();
        user2.setId(2);
        user2.setFirstName("demo");
        user2.setLastName("user");
        user2.setUri("/user-management/users/2");

        Users users = new Users();
        users.setUsers(new ArrayList());
        users.getUsers().add(user1);
        users.getUsers().add(user2);

        return users;
    }

    @GET
    @Path("/users/{id}")
    @Produces("application/vnd.com.demo.user-management.user+xml;charset=UTF-8;version=1")
    public User getUserById(@PathParam("id") int id) {
        User user = new User();
        user.setId(id);
        user.setFirstName("demo");
        user.setLastName("user");
        user.setUri("/user-management/users/" + id);
        return user;
    }

    @POST
    @Path("/users")
    @Consumes("application/vnd.com.demo.user-management.user+xml;charset=UTF-8;version=1")
    public Response createUser(User user,
            @DefaultValue("false") @QueryParam("allow-admin") boolean allowAdmin)
            throws URISyntaxException {
        System.out.println(user.getFirstName());
        System.out.println(user.getLastName());
        return Response.status(201)
                .contentLocation(new URI("/user-management/users/123")).build();
    }

    @PUT
    // @Path("/users/{id: [0-9]*}")
    @Path("/users/{id}")
    @Consumes("application/vnd.com.demo.user-management.user+xml;charset=UTF-8;version=1")
    @Produces("application/vnd.com.demo.user-management.user+xml;charset=UTF-8;version=1")
    public User updateUser(@PathParam("id") int id, User user)
            throws URISyntaxException {
        user.setId(id);
        user.setFirstName(user.getFirstName() + "updated");
        return user;
    }

    @DELETE
    @Path("/users/{id}")
    public Response deleteUser(@PathParam("id") int id)
            throws URISyntaxException {
        return Response.status(200).build();
    }
}
5) Run the application
When we deploy above built application in jboss and hit the URL: ” http://localhost:8080/RESTfulDemoApplication/user-management/users”, below is the response.
JBOSS 7+ RESTEasy demo application
JBOSS 7+ RESTEasy demo application
To download the source code of above example, click below link.
Happy Learning !!

No comments: