Spring可选@PathVariable?

时间:2014-09-02 13:02:18

标签: spring spring-mvc

如果PathVariable仅出现在某些请求中,是否有可能以某种方式获得 @ControllerAdvice 中的@PathVariable

如果这是在Controller中,我可以编写2个不同的控制器。但ControllerAdvice始终适用于所有请求。我不能将ControllerAdvice仅应用于定义了PathVariable的控制器。

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:1)

这个答案还可以,但我花了一些时间才发现你需要在函数之前添加@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 {  ....  }