淺談@RequestMapping註解的註意點

@RequestMapping註解註意點

類上加沒加@RequestMappin註解區別

1.如果類上加瞭 @RequestMappin註解,那麼就會去該註解對應的路徑下去找頁面,如果沒有對應的頁面就會報錯。

舉例說明:

@RequestMapping("/user")
public class UserController {
    @RequestMapping("/requestParam51")
    public String requestParam51(String[] name) {
       return "index.jsp";
    }
}

對應的跳轉頁面會去user目錄下去找,找不到就會報錯。

2.如果類上沒有加@RequestMapping註解,就會直接去根路徑下去找頁面

3.如果為跳轉的頁面加瞭"/",還是會去根路徑下去找對應的頁面。

舉例:

@RequestMapping("/user")
public class UserController {
    @RequestMapping("/requestParam51")
    public String requestParam51(String[] name) {
       return "/index.jsp";
    }
}

@RequestMapping一個坑

今天發現瞭RequestMapping註解的一個坑:

當RequestMapping用於Class上時,不能用1.0,v1.0這樣帶小數點的value值做開頭

@Controller
@RequestMapping(value = "/v1.0")
public class TestController {
    @RequestMapping(value = "/a", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody
    Object getA() {
        return  "{\"test\" : \"a\"}";
    }
    @RequestMapping(value = "/b", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody
    Object getB() {
        return  "{\"test\" : \"b\"}";
    }
}

如上代碼運行後,訪問http://localhost:port/v1.0/a 或者http://localhost:port/v1.0/b 時都會報錯:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'testController' bean method 
public java.lang.Object com.my.test.controller.TestController.getB()
to {[/v1.0],methods=[GET],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}: There is already 'testController' bean method

單看異常信息,還以為是有重名的路徑,結果搜遍瞭工程也沒找到重名的類,後來"v1.0"改成"v1",就正常運行瞭。

順帶測試瞭下,發現改成1.0也是同樣的錯誤。

之後再把一個方法上RequestMapping的value去掉,采用默認寫法:

    @RequestMapping("/b")
    public @ResponseBody
    Object getB() {
        return  "{\"test\" : \"b\"}";
    }

再運行起來,訪問http://localhost:port/v1.0/a或者http://localhost:port/v1.0/b 就會變成404錯誤。

HTTP Status 404 - /v1.0/a
type Status report
message /v1.0/a
description The requested resource is not available.

沒深究根本原因,估計是Spring的小bug,以後避免帶小數點的路徑頭。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: