CXF Rest Server

23 篇文章 1 订阅
8 篇文章 0 订阅
研究了两天CXF对restful的支持。
现在,想实现一个以
http://localhost:9999/roomservice 为入口,
http://localhost:9999/roomservice/room为房间列表,
http://localhost:9999/roomservice/room/001/ 为001号房间的信息,
http://localhost:9999/roomservice/room/001/person 为在001号房间主的人的列表

实现用HTTP请求对以上资源的CRUD。

首先建立room,person的POJO,这里只有一点需要注意:
Java代码 收藏代码
  1. package com.DAO;
  2. import javax.xml.bind.annotation.XmlRootElement;
  3. @XmlRootElement(name="Person")
  4. public class Person {
  5. private String name;
  6. private String sex;
  7. public String getName() {
  8. return name;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public String getSex() {
  14. return sex;
  15. }
  16. public void setSex(String sex) {
  17. this.sex = sex;
  18. }
  19. }



一定要在类的前边加上annotation ,这样才能让这个person的信息在POJO和XML之间转换。Room同理:
Java代码 收藏代码
  1. import java.util.Map;
  2. import javax.xml.bind.annotation.XmlRootElement;
  3. @XmlRootElement(name="Room")
  4. public class Room {
  5. public Room()
  6. {
  7. persons=new HashMap<String,Person>();
  8. }
  9. String id;
  10. Map<String,Person> persons;
  11. public String getId() {
  12. return id;
  13. }
  14. public void setId(String id) {
  15. this.id = id;
  16. }
  17. public Map<String, Person> getPersons() {
  18. return persons;
  19. }
  20. public void setPersons(Map<String, Person> persons) {
  21. this.persons = persons;
  22. }
  23. }


POJO有了,接下来要写DAO,由于主要是为了学习restful,为了方便,不必要将数据持久化到数据库,而是存在一个静态的HashMap中:

Java代码 收藏代码
  1. package com.DAO;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class RoomDAO {
  5. private static Map<String, Room> rooms;
  6. static {
  7. rooms = new HashMap<String, Room>();
  8. //this room is for testing
  9. Person p1=new Person();
  10. p1.setName("Boris");
  11. p1.setSex("male");
  12. Room r=new Room();
  13. r.setId("001");
  14. r.getPersons().put(p1.getName(), p1);
  15. rooms.put("001", r);
  16. }
  17. public static void addRoom(Room room) {
  18. rooms.put(room.getId(), room);
  19. }
  20. public static void deleteRoom(String id) {
  21. if (rooms.containsKey(id)) {
  22. rooms.remove(id);
  23. }
  24. }
  25. public static void updateRoom(String id,Room room) {
  26. rooms.remove(id);
  27. rooms.put(room.getId(), room);
  28. }
  29. public static Room getRoom(String id) {
  30. if (rooms.containsKey(id)) {
  31. return rooms.get(id);
  32. } else {
  33. return null;
  34. }
  35. }
  36. /*operations to persons*/
  37. public static void addPerson(String id_room,Person person) {
  38. if(rooms.containsKey(id_room))
  39. {
  40. Room room=rooms.get(id_room);
  41. room.getPersons().put(person.getName(), person);
  42. }
  43. }
  44. public static Rooms getRooms()
  45. {
  46. return new Rooms();
  47. }
  48. public static void deletePerson(String id_room,String name)
  49. {
  50. if(rooms.containsKey(id_room))
  51. {
  52. Room room=rooms.get(id_room);
  53. room.getPersons().remove(name);
  54. }
  55. }
  56. public static Map<String, Room> getMapOfRooms()
  57. {
  58. return rooms;
  59. }
  60. }




接下来是重点,如果想发布restful webservice,要通过一个叫JAXRSServerFactoryBean的类来发布。这个类有几个方法是要了解的:

public void setResourceClasses(Class... classes);
那一系列的Class类型的参数,是告诉这个类,发布服务时,会用到的POJO(就像上边写的Room,Person)。

public void setAddress(String address);
这个方法是告诉这个类,服务的地址,比如"http://localhost:9999"

public void setServiceBeans(Object... beans)
这里是重点,这个方法,要给这个用来发布服务的类一个Service bean.这个Bean是我们要手动编写的,作用是告诉服务,收到什么样的请求,应该怎么样处理。

现在,先来编写这个Service bean:

Java代码 收藏代码
  1. package com.server;
  2. import javax.ws.rs.Consumes;
  3. import javax.ws.rs.DELETE;
  4. import javax.ws.rs.GET;
  5. import javax.ws.rs.POST;
  6. import javax.ws.rs.PUT;
  7. import javax.ws.rs.Path;
  8. import javax.ws.rs.PathParam;
  9. import javax.ws.rs.Produces;
  10. import com.DAO.Person;
  11. import com.DAO.Room;
  12. import com.DAO.RoomDAO;
  13. import com.DAO.Rooms;
  14. @Path("/roomservice")
  15. @Produces("application/xml")
  16. public class RoomService {
  17. @GET
  18. @Path("/room/{id}")
  19. @Consumes("application/xml")
  20. public Room getRoom(@PathParam("id")String id )
  21. {
  22. System.out.println("get room by id= "+id);
  23. Room room=RoomDAO.getRoom(id);
  24. return room;
  25. }
  26. @GET
  27. @Path("/room")
  28. @Consumes("application/xml")
  29. public Rooms getAllRoom()
  30. {
  31. System.out.println("get all room");
  32. Rooms rooms=RoomDAO.getRooms();
  33. return rooms;
  34. }
  35. @POST
  36. @Path("/room")
  37. @Consumes("application/xml")
  38. public void addRoom(Room room)
  39. {
  40. System.out.println("add room which id is:"+room.getId());
  41. RoomDAO.addRoom(room);
  42. }
  43. @PUT
  44. @Path("/room/{id}")
  45. @Consumes("application/xml")
  46. public void updateRoom(@PathParam("id")String id,Room room)
  47. {
  48. System.out.println("update room which original id is:"+room.getId());
  49. RoomDAO.updateRoom(id,room);
  50. }
  51. @DELETE
  52. @Path("/room/{id}")
  53. @Consumes("application/xml")
  54. public void deleteRoom(@PathParam("id")String id)
  55. {
  56. System.out.println("remove room by id= "+id);
  57. RoomDAO.deleteRoom(id);
  58. }
  59. @POST
  60. @Path("/room/{id}")
  61. @Consumes("application/xml")
  62. public void addPerson(@PathParam("id") String id,Person person)
  63. {
  64. System.out.println("add person who's name is:"+person.getName());
  65. RoomDAO.addPerson(id, person);
  66. }
  67. @DELETE
  68. @Path("/room/{id}/{name}")
  69. @Consumes("application/xml")
  70. public void deletePerson(@PathParam("id")String id,@PathParam("name")String name)
  71. {
  72. System.out.println("remove person who's name is: "+name);
  73. RoomDAO.deletePerson(id, name);
  74. }
  75. }





需要注意:每个方法之前,要用annotation声明http请求的method类型,比如GET,DELETE,POST, PUT.

@Produces("application/xml")我还没弄清楚到底是声明的接受格式还是返回格式,还是其他。

@Path("/room/{id}")中的id是一个参数,应该在方法的参数列表中声明:
public void deletePerson(@PathParam("id")String id,@PathParam("name")String name)
这样就能得到URL中的id了。

现在,这些房间被资源化了,id为001的房间被资源化为一个URL,那地址应该是
http:{服务器地址}:{端口}/roomservice/rrom/001

现在,创建一个Server:
Java代码 收藏代码
  1. package com.server;
  2. import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
  3. import com.DAO.Person;
  4. import com.DAO.Room;
  5. import com.DAO.Rooms;
  6. public class Server {
  7. public static void main(String[] args) {
  8. RoomService service = new RoomService();
  9. // Service instance
  10. JAXRSServerFactoryBean restServer = new JAXRSServerFactoryBean();
  11. restServer.setResourceClasses(Room.class,Person.class,Rooms.class);
  12. restServer.setServiceBeans(service);
  13. restServer.setAddress("http://localhost:9999/");
  14. restServer.create();
  15. }
  16. }



现在,服务已经发布成功了,在浏览器输入http://localhost:9999/roomservice/room/001 得到结果:
Xml代码 收藏代码
  1. <room>
  2. <id>001</id>
  3. <persons>
  4. <entry>
  5. <key>Boris</key>
  6. <value>
  7. <name>Boris</name>
  8. <sex>male</sex>
  9. </value>
  10. </entry>
  11. </persons>
  12. </room>


如果用浏览器去访问,发送的http请求只能所GET,因此如果想对数据进行操作,必须写一个客户端。
在写客户端之前,有一个问题:
在浏览器输入http://localhost:9999/roomservice/room/
什么都看不到,可是,我想要得到房间列表。但是,cxf发布restful只认你给他的类的class。所以你想让服务器返回一个room的列表给客户端,是不行的。所以,必须想别的办法,我是又写了一个POJO,这个POJO里只有一个属性,就是一个存放所有room的Map:
package com.DAO;

Java代码 收藏代码
  1. import java.util.Map;
  2. import javax.xml.bind.annotation.XmlRootElement;
  3. @XmlRootElement(name="rooms")
  4. public class Rooms {
  5. Map<String,Room> rooms;
  6. public Rooms()
  7. {
  8. rooms=RoomDAO.getMapOfRooms();
  9. }
  10. public Map<String, Room> getRooms() {
  11. return rooms;
  12. }
  13. public void setRooms(Map<String, Room> rooms) {
  14. this.rooms = rooms;
  15. }
  16. }

这样,然后再把DAO的方法加上:
Java代码 收藏代码
  1. @GET
  2. @Path("/room")
  3. @Consumes("application/xml")
  4. public Rooms getAllRoom()
  5. {
  6. System.out.println("get all room");
  7. Rooms rooms=RoomDAO.getRooms();
  8. return rooms;
  9. }


这样就能以list的形式显示出所有room了。
访问http://localhost:9999/roomservice/room/
结果如下:
Xml代码 收藏代码
  1. <rooms>
  2. <rooms>
  3. <entry>
  4. <key>006</key>
  5. <value>
  6. <id>006</id>
  7. <persons/>
  8. </value>
  9. </entry>
  10. <entry>
  11. <key>001</key>
  12. <value>
  13. <id>001</id>
  14. <persons>
  15. <entry>
  16. <key>Boris</key>
  17. <value>
  18. <name>Boris</name>
  19. <sex>male</sex>
  20. </value>
  21. </entry>
  22. </persons>
  23. </value>
  24. </entry>
  25. </rooms>
  26. </rooms>



关于客户端 http://sunbo1591.iteye.com/blog/766029
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值