Monday, December 07, 2009

Spring and REST

After loving for more than two years Don Brown's fantastic REST plugin for Struts2 I decendent again into Spring's version of REST (see http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/) My simple porting of Don Brown's demo app to Spring failed again (I tried 12 months ago to use some work from carbon five) Anyway why, why does it not work I thought I had it figured out:



package edu.ucsd.extension.springmvchelloworld;

import java.util.Collection;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;



@Controller
public class OrdersController {

private Order model = new Order();
private Collection list;
private OrdersService ordersService = new OrdersService();

// GET /orders/1
@RequestMapping("{orderId}")
public String show(@PathVariable String id, Model model) {
System.out.println("Showing order " + id);
setId(id);
model.addAttribute("order", getModel());
return "show";
}

// GET /orders
@RequestMapping
public String index(Model model) {
list = ordersService.getAll();
model.addAttribute("orders", list);
return "orders-index";
}

// GET /orders/1/edit
@RequestMapping("/{orderId}/edit")
public String edit(@PathVariable String id, Model model) {
this.setId(id);
model.addAttribute("order", getModel());
return "orders-edit";
}

// GET /orders/new
@RequestMapping("/new")
public String editNew(Model model) {
model.addAttribute("order", new Order());
return "orders-editNew";
}

// GET /orders/1/deleteConfirm
@RequestMapping("/{orderId}/deleteConfirm")
public String deleteConfirm(@PathVariable String id) {
this.setId(id);
return "orders-deleteConfirm";
}

// DELETE /orders/1
@RequestMapping(value="/{orderId}", method=RequestMethod.DELETE)
public String destroy(@PathVariable String id) {
ordersService.remove(id);
//addActionMessage("Order removed successfully");
return "orders-index";
}

// POST /orders
@RequestMapping(method=RequestMethod.POST)
public ModelAndView create(Order model) {
ordersService.save(model);
return new ModelAndView("orders-show", "model", getModel());
}

// PUT /orders/1
@RequestMapping(value="/{orderId}", method=RequestMethod.PUT)
public String update(@PathVariable String id, Order model) {
ordersService.save(model);
return "order-index";
}

public void setId(String id) {
if (id != null) {
this.model = ordersService.get(id);
}
}

public Object getModel() {
return (list != null ? list : model);
}

}


Well, I guess there is some other trick I am missing.

BTW: the repository in the POM file needs to look like:



org.springsource.maven.snapshot
Springframework milestone
http://maven.springframework.org/milestone