代码之家  ›  专栏  ›  技术社区  ›  Tobia

如何从属性中读取可变数目的注释值

  •  0
  • Tobia  · 技术社区  · 5 年前

    在spring(boot)中,我可以使用 ${...} 语法:

    @RequestMapping("${some.path.property}")
    

    我还可以将控制器映射到多个路径:

    @RequestMapping("/one", "/two")
    

    我如何把两者结合起来?我想在我的属性中定义一个路径列表,或者用逗号分隔 /one, /two 或者(最好)作为我的 application.yaml :

    some.path.property:
        - /one
        - /two
    

    但是,如何在注释中插入这两种列表呢?

    @RequestMapping(???)
    

    编辑:我不知道如何从yaml中读取整个列表(可能是因为它变成了单独的属性 some.path.property[0] , some.path.property[1] …在yaml解析时?)

    对于单个csv属性的简单情况,请说:

    some.csv.property: /one, /two
    

    我可以使用属性替换: "${some.csv.property}" 或显式spel拆分: "#{'${some.csv.property}'.split('[, ]+')}" 将其转换为数组,但在这两种情况下它都只适用于 @Value 注解。如果我试穿的话 @RequestMapping ,我总是走一条路。


    伊迪丝2:我可以这么做,在哪 -- 只是一个不是有效路径的随机字符串,但它非常难看:

    @RequestMapping(
        "${some.path.property[0]:--}",
        "${some.path.property[1]:--}",
        "${some.path.property[2]:--}",
        "${some.path.property[3]:--}",
        "${some.path.property[4]:--}",
        "${some.path.property[5]:--}",
        "${some.path.property[6]:--}",
        "${some.path.property[7]:--}",
        "${some.path.property[8]:--}",
        "${some.path.property[9]:--}"
    )
    
    2 回复  |  直到 5 年前
        1
  •  1
  •   Michal Cholewiński    5 年前

    你试过这个吗?:

    some:
      path:
        property: /one, /two
    

    然后

    @RequestMapping("${some.path.property}") 
    

    基于这个答案 https://stackoverflow.com/a/41462567/7425783 它应该很好用

        2
  •  1
  •   Abdelghani Roussi    5 年前

    如果你有一个yaml属性文件(不要重复你的自我原则:),你可以这样做:

    some:
      path:
        property:
          one: /path1
          two: /path2
    

    如果使用@getmapping(或@requestmapping),可以在控制器中这样做:

    @GetMapping(value={"${some.path.property.one}", "${some.path.property.two}"})
    

    这是日志

     Mapped "{[/path1 || /path2],methods=[GET]}" onto public java.util.List<com.zero.SimpleController> com.zero.SimpleController.hello()
    
        3
  •  0
  •   Chao Luo    5 年前

    你可以尝试创建 HandlerMapping 要添加url,下面是一个使用 SimpleUrlHandlerMapping

    @RestController
    public class WelcomeController {
    
        public String ping() {
            return "pong";
        }
    }
    
    @SpringBootApplication
    @Slf4j
    @RestController
    public class StackOverflowApplication {
    
        @Autowired
        WelcomeController welcomeController;
    
        @Value("${paths}")
        List<String> paths;
    
    
        public static void main(String[] args) {
            SpringApplication.run(StackOverflowApplication.class, args);
        }
    
    
    
        @Bean
        public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
            SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping();
            Map<String, Object> map = new HashMap<>();
            final Method getUser = ReflectionUtils.findMethod(WelcomeController.class, "ping");
            final HandlerMethod handlerMethod = new HandlerMethod(welcomeController, getUser);
            for (String path : paths) {
                map.put(path, handlerMethod);
            }
            simpleUrlHandlerMapping.setUrlMap(map);
            simpleUrlHandlerMapping.setOrder(Ordered.HIGHEST_PRECEDENCE);
    
            return simpleUrlHandlerMapping;
        }
    
    
    }
    

    YML文件

    paths: ping, ping1, ping2, ping3
    

    这是密码 github