2
votes

I'm trying out Spring MVC 3.0 for the first time and like to make it RESTfull.

This is my controller:

    @Controller
@RequestMapping(value = "/product")
@SessionAttributes("product")
public class ProductController {

    @Autowired
    private ProductService productService;

    public void setProductValidator(ProductValidator productValidator, ProductService productService) {
        this.productService = productService;
    }

    @RequestMapping(method = RequestMethod.GET)
    public Product create() {
        //model.addAttribute(new Product());
        return new Product();
    }

    @RequestMapping(method = RequestMethod.POST)
    public String create(@Valid Product product, BindingResult result) {
        if (result.hasErrors()) {
            return "product/create";
        }
        productService.add(product);
        return "redirect:/product/show/" + product.getId();
    }

    @RequestMapping(value = "/show/{id}", method = RequestMethod.GET)
    public Product show(@PathVariable int id) {
        Product product = productService.getProductWithID(id);
        if (product == null) {
            //throw new ResourceNotFoundException(id);
        }
        return product;
    }

    @RequestMapping(method = RequestMethod.GET)
    public List<Product> list()
    {
        return productService.getProducts();
    }

}

I have 2 questions about this.

I'm a believer in Convention over Configuration and therefor my views are in jsp/product/ folder and are called create.jsp , list.jsp and show.jsp this works relatively well until I add the @PathVariable attribute. When I hit root/product/show/1 I get the following error: ../jsp/product/show/1.jsp" not found how do I tell this method to use the show.jsp view ?

If I don't add the RequestMapping on class level my show method will be mapped to root/show instead of root/owner/show how do I solve this ? I'd like to avoid using the class level RequestMapping.

2

2 Answers

2
votes

add your 'product' to Model and return a String /product/show instead of Product. In your show.jsp, you can access the product object form pageContext

1
votes

Check out the section in the manual about "Supported handler method arguments and return types".

Basically, when your @RequestMapping method returns just an object, then Spring uses this as a single model attribute, and, I'm guessing, attempts to use the request URL as the basis for the view name.

The easiest way to return the view and data you want from the same method is probably to just have the method return a ModelAndView, so you can explicitly specify the viewName and the model data.