2010-04-05 3 views
2

Я впервые опробовал Spring MVC 3.0 и хотел бы сделать его RESTfull.Spring MVC 3.0 Проблема с отдыхом

Это мой контроллер:

@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(); 
    } 

} 

У меня есть 2 вопроса по этому поводу.

Я верю в Конвенцию по конфигурации, и поэтому мои представления находятся в jsp/product/folder и называются create.jsp, list.jsp и show.jsp, которые работают относительно хорошо, пока я не добавлю атрибут @PathVariable. Когда я нажимаю root/product/show/1, я получаю следующую ошибку: ../jsp/product/show/1.jsp "не найден, как я могу сказать, что этот метод использует представление show.jsp?

Если я не добавлю RequestMapping на уровне класса, мой метод show будет сопоставлен с root/show вместо root/owner/show, как я могу это решить? Я бы хотел избежать использования класса RequestMapping.

ответ

1

Отъезд раздела в руководство по "Supported handler method arguments and return types".

В принципе, когда ваш метод @RequestMapping возвращает только объект, то Spring использует это как атрибут одной модели, и, я полагаю, пытается использовать URL-адрес запроса в качестве основы для имени представления.

Самый простой способ вернуть вид и данные, которые вы хотите от того же метода является то, вероятно, просто метод возвращают ModelAndView, так что вы можете явно указать VIEWNAME и данные модели.

+0

Как я уже упоминал выше, я знаю, что существуют различные подходы к решению этой проблемы. Тем не менее, мне нравится использовать мой текущий метод и, как решение проблемы с текущим подходом/соглашением типов возврата. Это должно быть возможно с моим текущим соглашением типа возврата вместо возвращаемых типов void/String/Model/ModelAndView. Спасибо за ваш ответ, и я знаю ваше решение. – Gidogeek

+0

Но я боюсь, что именно так Spring MVC с аннотациями ожидает, что вы вернете viewName - через возвращаемый тип метода. –

+0

метод create() имеет возвращаемый тип продукта, но использует create.jsp, как и метод list() использует list.jsp, поэтому почему метод show() не сможет использовать show.jsp? Я ценю ваше время, и я новичок в Spring, но когда работают другие 2 примера, я не понимаю, почему show() не будет работать. – Gidogeek

2

добавить «продукта» в Model и вернуть String /product/show вместо Product. в вашем show.jsp, вы можете получить доступ к форме объекта продукта pageContext

+0

Я знаю, что могу использовать возвращаемый тип String, но я предпочитаю не делать этого. Я бы хотел использовать возвращаемые типы, как сейчас. Это должно быть возможно, так как оно работает для всех других методов. Спасибо за быстрый ответ, хотя – Gidogeek

Смежные вопросы