CXF发布restful WebService的入门例子(服务器端)
研究了两天CXF对restful的支持。? package?com.DAO;?? ?? import?javax.xml.bind.annotation.XmlRootElement;?? ?? @XmlRootElement(name="Person")?? public?class?Person?{?? ????private?String?name;?? ????private?String?sex;?? ????public?String?getName()?{?? ????????return?name;?? ????}?? ????public?void?setName(String?name)?{?? ????????this.name?=?name;?? ????}?? ????public?String?getSex()?{?? ????????return?sex;?? ????}?? ????public?void?setSex(String?sex)?{?? ????????this.sex?=?sex;?? ????}?? ?????? } 一定要在类的前边加上annotation ,这样才能让这个person的信息在POJO和XML之间转换。Room同理:? import?java.util.Map;?? ?? import?javax.xml.bind.annotation.XmlRootElement;?? ?? @XmlRootElement(name="Room")?? public?class?Room?{?? ????public?Room()?? ????{?? ????????persons=new?HashMap<String,Person>();?? ????}?? ????String?id;?? ????Map<String,Person>?persons;?? ?????? ????public?String?getId()?{?? ????????return?id;?? ????}?? ????public?void?setId(String?id)?{?? ????????this.id?=?id;?? ????}?? ????public?Map<String,?Person>?getPersons()?{?? ????????return?persons;?? ????}?? ????public?void?setPersons(Map<String,?Person>?persons)?{?? ????????this.persons?=?persons;?? ????}?? } POJO有了,接下来要写DAO,由于主要是为了学习restful,为了方便,不必要将数据持久化到数据库,而是存在一个静态的HashMap中:? package?com.DAO;?? ?? import?java.util.HashMap;?? import?java.util.Map;?? ?? public?class?RoomDAO?{?? ????private?static?Map<String,?Room>?rooms;?? ????static?{?? ????????rooms?=?new?HashMap<String,?Room>();?? ?????????? ????????Person?p1=new?Person();?? ????????p1.setName("Boris");?? ????????p1.setSex("male");?? ?????????? ?????????? ?????????? ????????Room?r=new?Room();?? ????????r.setId("001");?? ????????r.getPersons().put(p1.getName(),?p1);?? ????????rooms.put("001",?r);?? ????}?? ?? ????public?static?void?addRoom(Room?room)?{?? ????????rooms.put(room.getId(),?room);?? ????}?? ?? ????public?static?void?deleteRoom(String?id)?{?? ????????if?(rooms.containsKey(id))?{?? ????????????rooms.remove(id);?? ????????}?? ?? ????}?? ?? ????public?static?void?updateRoom(String?id,Room?room)?{?? ????????rooms.remove(id);?? ????????rooms.put(room.getId(),?room);?? ????}?? ?? ????public?static?Room?getRoom(String?id)?{?? ????????if?(rooms.containsKey(id))?{?? ????????????return?rooms.get(id);?? ????????}?else?{?? ????????????return?null;?? ????????}?? ????}?? ????/*operations?to?persons*/?? ????public?static?void?addPerson(String?id_room,Person?person)?{?? ????????if(rooms.containsKey(id_room))?? ????????{?? ????????????Room?room=rooms.get(id_room);?? ????????????room.getPersons().put(person.getName(),?person);?? ????????}?? ????}?? ?????? ????public?static?Rooms?getRooms()?? ????{?? ????????return?new?Rooms();?? ????}?? ?????? ????public?static?void?deletePerson(String?id_room,String?name)?? ????{?? ????????if(rooms.containsKey(id_room))?? ????????{?? ????????????Room?room=rooms.get(id_room);?? ????????????room.getPersons().remove(name);?? ????????}?? ????}?? ?????? ????public?static?Map<String,?Room>?getMapOfRooms()?? ????{?? ????????return?rooms;?? ????}?? } 接下来是重点,如果想发布restful webservice,要通过一个叫JAXRSServerFactoryBean的类来发布。这个类有几个方法是要了解的:? package?com.server;?? ?? import?javax.ws.rs.Consumes;?? import?javax.ws.rs.DELETE;?? 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?com.DAO.Person;?? import?com.DAO.Room;?? import?com.DAO.RoomDAO;?? import?com.DAO.Rooms;?? ?? @Path("/roomservice")?? @Produces("application/xml")?? public?class?RoomService?{?? ?????? ????@GET?? ????@Path("/room/{id}")?? ????@Consumes("application/xml")?? ????public?Room?getRoom(@PathParam("id")String?id?)?? ????{?? ????????System.out.println("get?room?by?id=?"+id);?? ????????Room?room=RoomDAO.getRoom(id);?? ????????return?room;?? ????}?? ????@GET?? ????@Path("/room")?? ????@Consumes("application/xml")?? ????public?Rooms?getAllRoom()?? ????{?? ????????System.out.println("get?all?room");?? ????????Rooms?rooms=RoomDAO.getRooms();?? ????????return?rooms;?? ????}?? ?????? ????@POST?? ????@Path("/room")?? ????@Consumes("application/xml")?? ????public?void?addRoom(Room?room)?? ????{?? ????????System.out.println("add?room?which?id?is:"+room.getId());?? ????????RoomDAO.addRoom(room);?? ????}?? ????@PUT?? ????@Path("/room/{id}")?? ????@Consumes("application/xml")?? ????public?void?updateRoom(@PathParam("id")String?id,Room?room)?? ????{?? ????????System.out.println("update?room?which?original?id?is:"+room.getId());?? ????????RoomDAO.updateRoom(id,room);?? ????}?? ????@DELETE?? ????@Path("/room/{id}")?? ????@Consumes("application/xml")?? ????public?void?deleteRoom(@PathParam("id")String?id)?? ????{?? ????????System.out.println("remove?room?by?id=?"+id);?? ????????RoomDAO.deleteRoom(id);?? ????}?? ????@POST?? ????@Path("/room/{id}")?? ????@Consumes("application/xml")?? ????public?void?addPerson(@PathParam("id")?String?id,Person?person)?? ????{?? ????????System.out.println("add?person?who's?name?is:"+person.getName());?? ????????RoomDAO.addPerson(id,?person);?? ????}?? ????@DELETE?? ????@Path("/room/{id}/{name}")?? ????@Consumes("application/xml")?? ????public?void?deletePerson(@PathParam("id")String?id,@PathParam("name")String?name)?? ????{?? ????????System.out.println("remove?person?who's?name?is:?"+name);?? ????????RoomDAO.deletePerson(id,?name);?? ????}?? } 需要注意:每个方法之前,要用annotation声明http请求的method类型,比如GET,DELETE,POST,PUT.? package?com.server;?? ?? import?org.apache.cxf.jaxrs.JAXRSServerFactoryBean;?? ?? import?com.DAO.Person;?? import?com.DAO.Room;?? import?com.DAO.Rooms;?? ?? public?class?Server?{?? ?? ????public?static?void?main(String[]?args)?{?? ????????RoomService?service?=?new?RoomService();?? ?? ????????//?Service?instance?? ????????JAXRSServerFactoryBean?restServer?=?new?JAXRSServerFactoryBean();?? ????????restServer.setResourceClasses(Room.class,Person.class,Rooms.class);?? ????????restServer.setServiceBeans(service);?? ????????restServer.setAddress("http://localhost:9999/");?? ????????restServer.create();?? ????}?? } 现在,服务已经发布成功了,在浏览器输入http://localhost:9999/roomservice/room/001? 得到结果:? <room>??<id>001</id>???? <persons>???? <entry>??<key>Boris</key>???? <value>??<name>Boris</name>??<sex>male</sex>??</value>??</entry>??</persons>??</room> 如果用浏览器去访问,发送的http请求只能所GET,因此如果想对数据进行操作,必须写一个客户端。? import?java.util.Map;?? ?? import?javax.xml.bind.annotation.XmlRootElement;?? @XmlRootElement(name="rooms")?? public?class?Rooms?{?? ????Map<String,Room>?rooms;?? ????public?Rooms()?? ????{?? ????????rooms=RoomDAO.getMapOfRooms();?? ????}?? ????public?Map<String,?Room>?getRooms()?{?? ????????return?rooms;?? ????}?? ????public?void?setRooms(Map<String,?Room>?rooms)?{?? ????????this.rooms?=?rooms;?? ????}?? } 这样,然后再把DAO的方法加上:? @GET?? ????@Path("/room")?? ????@Consumes("application/xml")?? ????public?Rooms?getAllRoom()?? ????{?? ????????System.out.println("get?all?room");?? ????????Rooms?rooms=RoomDAO.getRooms();?? ????????return?rooms;?? ????} 这样就能以list的形式显示出所有room了。? <rooms>???? <rooms>???? <entry>??<key>006</key>???? <value>??<id>006</id>??<persons/>??</value>??</entry>???? <entry>??<key>001</key>???? <value>??<id>001</id>???? <persons>???? <entry>??<key>Boris</key>???? <value>??<name>Boris</name>??<sex>male</sex>??</value>??</entry>??</persons>??</value>??</entry>??</rooms>??</rooms> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |