【问题标题】:Spring optional @PathVariable?弹簧可选@PathVariable?
【发布时间】:2014-09-02 13:02:18
【问题描述】:

鉴于 PathVariable 仅存在于一些请求中,是否有可能以某种方式在 @ControllerAdvice 中获取@PathVariable

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

【问题讨论】:

  • @ExceptionHandler 方法确实不支持 ´@PathVariable´。
  • 您可以拥有任意数量的@ControllerAdvices。但我想知道为什么你需要@PathVariable

标签: spring spring-mvc


【解决方案1】:

您可以注入路径变量的 Map 并检查是否存在密钥。

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

    } else {
        // do something else
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-28
      • 2020-06-21
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2011-09-19
      • 2018-09-08
      相关资源
      最近更新 更多