【发布时间】:2011-06-16 09:08:29
【问题描述】:
我开发了一个简单的 RESTful Web 服务。
根资源类:
@Path("/order")
@RequestScoped
public class CustOrderContainerResource {
//<editor-fold defaultstate="collapsed" desc="Instance Variable">
@Context
private UriInfo myUriInfo;
@Context
private ResourceContext myResourceContext;
@Context
private SecurityContext mySecurityContext;
@Inject
private CustOrderDAO myCustOrderDAO;
public CustOrderContainerResource() {
}
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_ATOM_XML})
public List<Custorder> ReadCustomerOrder(@QueryParam("min")int min,
@QueryParam("max")int max, @Context Request myRequest,
@Context HttpHeaders myHeader) {
int totalOrder = 0;
List<Custorder> resultList = null;
totalOrder = myCustOrderDAO.count();
if(min == 0 && max == 0) {
throw new QueryParamException("Order ID is empty");
}
else if(max > totalOrder) {
throw new QueryParamException("Order ID Range is invalid");
}
resultList = myCustOrderDAO.findRange(min, max, "findOrderIDRange");
return resultList;
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Custorder> ReadCustomerOrder() {
// Check conditional get here
return myCustOrderDAO.findAll();
}
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_FORM_URLENCODED})
public Response createOrder(Custorder myCustOrder) {
String orderID = null;
myCustOrder.setStatus("pending");
myCustOrder.setOrderdate(new Date());
myCustOrder.setTotal("");
// Persist
myCustOrderDAO.create(myCustOrder);
// Get Order ID
// Embedded created URL for new customer order in response
return Response.created(myUriInfo.getAbsolutePath().resolve(myCustOrder.getOrderid() + "/")).build();
}
@Path("{orderID}")
// @Produces(MediaType.TEXT_HTML)
public CustOrderResource ReadSingleCustomerOrder(@PathParam("orderID") String orderID) {
int userOrderID = Integer.parseInt(orderID);
int myOrderID = myCustOrderDAO.count();
CustOrderResource myCustorder = null;
if(userOrderID > myOrderID
|| myCustOrderDAO.find(orderID) == null) {
throw new OrderNotFoundException("Order ID Not Found");
}
if(!mySecurityContext.isUserInRole("admin")) {
// Propogates to specific resource class
myCustorder = myResourceContext.getResource(CustOrderResource.class);
myCustorder.setOrderID(orderID);
}
return myCustorder;
// return CustOrderResource.getInstance(myCustOrderDAO, orderID);
}
}
子资源定位器类:
@RequestScoped
public class CustOrderResource {
//<editor-fold defaultstate="collapsed" desc="Instance Variable">
@Inject
private CustOrderDAO myCustOrderDAO;
private String orderID;
private static final Logger myLogger = Logger.getLogger(CustOrderResource.class.getName());
//</editor-fold>
// ========================================================
public CustOrderResource() {
}
private CustOrderResource(String orderID) {
this.orderID = orderID;
}
public static Custorder getInstance(CustOrderDAO myCustOrderDAO, String orderID) {
return myCustOrderDAO.find(orderID);
}
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_ATOM_XML})
public Custorder getCustomerOrder() {
return myCustOrderDAO.find(orderID);
}
@POST
@Consumes(MediaType.APPLICATION_XML)
public String updateCustomerOrder() {
return "so";
/*try {
myCustOrderDAO.update(myCustOrder);
}
catch(Exception e) {
myLogger.log(Level.ALL, e.toString());
throw new WebApplicationException(
Response.status(Status.INTERNAL_SERVER_ERROR)
.entity("Cust Order Update Failed").build());
}*/
}
@DELETE
// 415 Unsupported media type
public String deleteCustomerOrder() {
return "Deleted";
// myCustOrderDAO.delete(myCustOrder);
}
public String getOrderID() {
return orderID;
}
public void setOrderID(String orderID) {
this.orderID = orderID;
}
}
我的问题是
- AFAIK,资源上下文将传播到特定的资源类 当我们根据 HTTP 方法将其指定为参数时,例如 发布或删除。如何从子资源定位器传递参数 方法改成子资源类方法?
我尝试使用带有 XML 数据的 post 方法更新客户订单,但不幸的是 JAX-RS 运行时返回 415 Unsupported media type。
我正在使用来自http://code.google.com/p/rest-client/ 的 REST 客户端来测试我的应用程序,方法是将 XML 文件粘贴到正文选项卡内容中。它有什么问题?
- 当我返回一个列表时,JAXB 是否自动转换为 XML 对象?我已经测试过,它返回 xml 格式,但只是想要 确认。返回响应对象是否更灵活?
我想知道如何使用对象列表和 URI 列表构建响应对象,或者使用对象列表 (Apache Abdera) 构建 Atom XML。
- 如何在我的数据库中找出新持久化对象的 ID
createCustomerOrder方法?
谢谢。
请帮忙。
【问题讨论】:
-
任何人请帮助我。感谢您的建议。
-
任何人请帮助我。谢谢。
-
通过阅读 jersey 1.7 用户指南解决了问题。谢谢。
-
干得好,peterwkc。友情提示,您能否自行发布该问题的答案,然后接受该答案,以便我们关闭此问题?此外,如果他们解决了您的问题,您需要接受之前问题的答案。
标签: java rest service jaxb response