利用CXF发布restful WebService的注意事项(服务器端)
研究了两天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,这里只有一点需要注意:
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;}}
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;}}
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;}}
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);}}
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 instanceJAXRSServerFactoryBean restServer = new JAXRSServerFactoryBean();restServer.setResourceClasses(Room.class,Person.class,Rooms.class);restServer.setServiceBeans(service);restServer.setAddress("http://localhost:9999/");restServer.create();}}
<room><id>001</id>?<persons>?<entry><key>Boris</key>?<value><name>Boris</name><sex>male</sex></value></entry></persons></room>
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;}}
@GET@Path("/room")@Consumes("application/xml")public Rooms getAllRoom(){System.out.println("get all room");Rooms rooms=RoomDAO.getRooms();return rooms;}
<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>