在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]:--}"
)
你试过这个吗?:
some:
path:
property: /one, /two
然后
@RequestMapping("${some.path.property}")
基于这个答案https://stackoverflow.com/a/41462567/7425783它应该工作正常
如果你有一个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()
你可以尝试创建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中的代码