利用RAD和WAS开发JAX-RS服务

来源:互联网 发布:润和软件怎么样 编辑:程序博客网 时间:2024/05/15 09:58
JAX-RS 1.1是RESTful服务的Java EE标准,是Java EE 6引入的规范。WebSphereApplication Server提供了对JAX-RS的支持。我们可以看一下具体的版本:

JAX-RS

Notes

WebSphere Application

Server

1.0

Requires Dynamic Web

Module 2.3 or higher and

Java 1.5 or higher

7.0 with Feature Pack for

Web 2.0

8.0

1.1

Requires Dynamic Web

Module 2.4 or higher and

Java 1.6 or higher. Based

on Apache Wink 1.1.1

7.0 with Feature Pack for

Web 2.0

8.0

可以看出,WAS8.0自带的JAX-RS运行时是基于Apache Wink。

 

JAX-RS的规范的具体的包有:

javax.ws.rs

javax.ws.rs.core

javax.ws.rs.ext

 

其中javax.ws.rs中有几个常用的标注:

GET,POST,PUT,DELETE,HEAD,OPTIONS

Path

Produces,Consumes

PathParam,QueryParam,HeaderParam,CookieParam,MatrixParam,FormParam,DefaultValue ,Encoded

PermitAll, DenyAll, RolesAllowed (JSR 250)


 

JAX-RS的规范一般存在于WAS运行时的j2ee.jar中。而其实现则是存在于WAS运行时的com.ibm.ws.jaxrs.jar中。

 

Rational ApplicationDeveloper (RAD)是专门为WAS设计的一款Java EE的开发工具。下面我们以一个实例来说明如何用RAD和WAS来开发一个简单的JAX-RS服务。

 

首先创建一个REST Service的Web Project。

在该项目中,创建一个类StartApplication来继承javax.ws.rs.core.Application.并将所创建的资源类加入到该类中。

publicclassStartApplication extends Application {       @Override      publicSet<Class<?>> getClasses() {            Set<Class<?>> classes = newHashSet<Class<?>>();            classes.add(HelloService.class);            return classes;      } }


同时在web.xml中注册该类作为init-param

      <servlet>            <description>            JAX-RS Tools Generated - Do notmodify</description>            <servlet-name>JAX-RS Servlet</servlet-name>            <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>            <init-param>                  <param-name>javax.ws.rs.Application</param-name>                  <param-value>applications.StartApplication</param-value>            </init-param>            <load-on-startup>1</load-on-startup>            <enabled>true</enabled>            <async-supported>false</async-supported>      </servlet>


 

接下来,创建一个JavaBean来保存相应的数据。

publicclass User {           private String firstName;      private String lastName;      public StringgetFirstName() {            returnfirstName;      }      publicvoidsetFirstName(String firstName) {            this.firstName = firstName;      }      public String getLastName() {            returnlastName;      }      publicvoidsetLastName(String lastName) {            this.lastName = lastName;      }}


最后,创建一个服务。

@javax.ws.rs.Path("/HelloService")publicclass HelloService {           privatestaticList<User> users = new ArrayList<User>();           public UsergetUserByFirstName(String firstName){            for(User u : users){                  if(u.getFirstName().equals(firstName)){                        return u;                  }            }            returnnull;      }           publicList<User> getUsers() {            returnusers;      }       static {            User user1 = new User();            user1.setFirstName("tom");            user1.setLastName("cat");                       User user2 = new User();            user2.setFirstName("tom1");            user2.setLastName("cat1");                       User user3 = new User();            user3.setFirstName("tom2");            user3.setLastName("cat2");                       users.add(user1);            users.add(user2);            users.add(user3);      }           @javax.ws.rs.Path("/getuser/{firstName}")      @javax.ws.rs.GET      @javax.ws.rs.Produces("application/json")      public JSONObjectgetUser(@javax.ws.rs.PathParam(value="firstName")String firstName){            JSONObject obj = new JSONObject();            User user =getUserByFirstName(firstName);            obj.put("firstname",user.getFirstName());            obj.put("lastname",user.getLastName());            return obj;      }           @javax.ws.rs.Path("/getalluser")      @javax.ws.rs.GET      @javax.ws.rs.Produces("application/json")      public JSONArraygetAllUser(){            List<User> users = this.getUsers();            System.out.println("users.size():"+users.size());            JSONArray array = newJSONArray(users.size());             for(User u :users){                  JSONObject obj = new JSONObject();                  obj.put("firstname",u.getFirstName());                  obj.put("lastname",u.getLastName());                  array.add(obj);            }                return array;      }           @javax.ws.rs.Path("/createuser")      @javax.ws.rs.POST      @javax.ws.rs.Consumes("application/json")      @javax.ws.rs.Produces("application/json")      public JSONObjectcreateUser(JSONObject obj){            User user = new User();            String firstName = (String)obj.get("firstname");            String lastName = (String)obj.get("firstname");            user.setFirstName(firstName);            user.setLastName(lastName);            this.users.add(user);            for(User u : users){                  System.out.println(u.getFirstName()+": "+u.getLastName());            }                       JSONObject response = new JSONObject();            response.put("firstname",user.getFirstName());            response.put("lastname",user.getLastName());            return response;      } }

在这个服务中,我们使用了javax.ws.rs中有几个常用的标注用于创建GET和POST的RESTful服务,以及JSON4J的API。

最后把该Web Project发布到WAS上,就可以利用一些第三方测试工具(如REST Client)对该服务进行测试。

 

关于客户端:

比较遗憾的是,JAX-RS 1.0没有带标准的Java Client API。但是我们可以用一些第三方库来调用JAX-RS服务。这里有个讨论帖子

JAX-RS is perfect for implementing REST. What do you use to call REST services in Java?


low-level: 标准的Java URL编程API。或是Apache HttpClient。

high-level: REST Service的库,比如Restlet,Jersey,RESTEasy,Apache CXF等。

好消息是,JavaEE7发布的JAX-RS2.0开始带标准的Java Client API,期待中。。。

这篇文章写得非常好,包括如何用JAX-RS/Jersey创建服务端,如何用URL编程、HttpClient、Jersey来访问服务

How to build RESTful Service with Java using JAX-RS and Jersey (Example)  http://crunchify.com/how-to-build-restful-service-with-java-using-jax-rs-and-jersey/

 个人比较倾向于Jersey,因为它是JAX-RS的标准实现,可以和JAX-RS的规范接轨。另外的好处是,可以在Jersey Client的API中直接Marshell Pojo,无需再去处理返回的字符串(主要为XML或JSON格式字符串)。文档http://stackoverflow.com/questions/10924984/jax-rs-jersey-client-marshaling-json-response-with-pojo-mapping-jackson中提到了一些注意事项。当然,有时候我们还是需要用JSON的API来解析JSON字符串,来自定义一些操作。


参考资料:

使用 JAX-RS 简化 REST 应用开发:http://www.ibm.com/developerworks/cn/java/j-lo-jaxrs/index.html


 


原创粉丝点击