2017-03-14 253 views
0

我有一個基於Spring Web模型 - 視圖 - 控制器(MVC)框架的項目。春天的Web模型 - 視圖 - 控制器(MVC)架構的版本是3.2.8錯誤400 - 錯誤的請求

我有這個控制器

@SuppressWarnings("unchecked") 
    @RequestMapping(value = { "/books/store/product", 
        "/books/store/product/", 
        "/books/store/product/{productId}", 
        "/books/store/product/{productId}/" }, method = { RequestMethod.POST }) 
    public String saveProduct(@ModelAttribute("productForm") ProductForm productForm, 
           @PathVariable Long productId, 
      HttpServletRequest request, Model model) throws Exception { 

.. 
} 

一切都很好,這個網址:/books/store/product/232

,但是這一個/books/store/product/

我得到這個錯誤:

錯誤400 - 錯誤的請求

From RFC 2068 Hypertext Transfer Protocol -- HTTP/1.1: 

10.4.1 400 Bad Request 

The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications. 

我試圖把這個@PathVariable(required = false),但我得到一個編譯錯誤:The attribute required is undefined for the annotation type PathVariable

+0

您應該添加@PathVariable(必需= false) –

+1

最好將它分成兩個方法,一個使用PathVariable,另一個不使用,也不需要添加「/」映射,這是無用的 –

回答

1

這是因爲服務總是等待路徑變量productId

因爲你使用Spring 3我建議你創建2個方法。一個有路徑變量,另一個沒有它。

@RequestMapping(value = { "/books/store/product", 
        "/books/store/product/"}, method = { RequestMethod.POST }) 
    public String saveProduct(@ModelAttribute("productForm") ProductForm productForm, 
      HttpServletRequest request, Model model) throws Exception { 

.. 
} 

@RequestMapping(value = { "/books/store/product/{productId}", 
        "/books/store/product/{productId}/" }, method = { RequestMethod.POST }) 
    public String saveProduct(@ModelAttribute("productForm") ProductForm productForm, 
           @PathVariable Long productId, 
      HttpServletRequest request, Model model) throws Exception { 

.. 
} 

如果你使用Spring 4和Java 8,我建議你使用可選的。

@PathVariable Optional<Long> productId 
+0

必須是這樣的: @PathVariable可選 productId –

+0

是的,你是對的 – reos

+0

同樣的問題:-(怎麼回事? –

0

如果您不總是需要productId。嘗試使用查詢參數並使其成爲可選項。 required=false

該網址會是這個樣子:

  1. http://localhost:8080/books/store/product?productId=232
  2. http://localhost:8080/books/store/product

像這樣:

@SuppressWarnings("unchecked") 
    @RequestMapping(value = { "/books/store/product", 
        }, method = { RequestMethod.POST }) 
    public String saveProduct(@ModelAttribute("productForm") ProductForm productForm, 
@RequestParam(value = "productId", required = false) Long productId, 
      HttpServletRequest request, Model model) throws Exception { 

.. 
} 

希望它能幫助。

+0

或者,使兩個單獨的方法之一與路徑變量和其他沒有路徑變量。 –