如何从属性中读取可变数量的@RequestMapping路径

问题描述 投票:0回答:3

在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上尝试,我总是以一条路径结束。


Edit2:我可以这样做,其中--只是一个不是有效路径的随机字符串,但它非常难看:

@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]:--}"
)
spring spring-boot spring-el
3个回答
1
投票

你试过这个吗?:

some:
  path:
    property: /one, /two

然后

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

基于这个答案https://stackoverflow.com/a/41462567/7425783它应该工作正常


1
投票

如果你有一个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()

0
投票

你可以尝试创建HandlerMapping来添加网址,这里只是一个使用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中的代码

© www.soinside.com 2019 - 2024. All rights reserved.