2014-09-02 82 views
1

是否有可能在給定@ControllerAdvice某種方式得到一個@PathVariable的保持了PathVariable只存在於一些請求?Spring可選@PathVariable?

如果這是一個控制器,我可以寫2個不同的控制器。但ControllerAdvice始終適用於所有請求。我不能只有ControllerAdvice適用於PathVariable定義的控制器。

+0

「@ PathVariable'不@ExceptionHandler方法確實支持。 – 2014-09-02 13:51:23

+0

您可以根據需要擁有儘可能多的@ControllerAdvices。但我想知道爲什麼你需要'@ PathVariable'。 – zeroflagL 2014-09-03 07:20:18

回答

3

您可以注入路徑變量的Map並檢查密鑰的存在。

public void advise(@PathVariable Map<String, String> pathVariables) { 
    if (pathVariables.containsKey("something")) { 
     String something = pathVariables.get("something"); 
     // do something 

    } else { 
     // do something else 
    } 
} 
+0

工作正常!謝謝! – rustyx 2015-03-14 14:39:07

0

這個答案是可以的,但是我花了一段時間才發現需要在函數前添加@ModelAttribute註解。同樣很高興知道您可以注入您在控制器@RequestMapping方面使用的任何變量。因此,例如全班看起來像

@ControllerAdvice(basePackages = {"test.web.controller"}) 
public class SomeAdvicer { 
    @ModelAttribute 
    public void advise(@PathVariable Map<String, String> pathVariables, SomeOtherClass ctx) { 
     if (pathVariables.containsKey("something")) { 
      if (!pathVariables.get("something").equals(ctx.getSomething())){ 
       throw new Exception("failed"); 
      } 
     } 
    } 
} 

當你的控制器看起來像

@RequestMapping(method = RequestMethod.PUT, value = "/{something}") 
@ResponseBody 
public ResponseEntity<test> updateDemo(
     @PathVariable(value = "invoicerId") 
     @RequestBody RequestMessage requestBodyMessage, 
     SomeOtherClass ctx) throws RestException { .... } 
相關問題