当前位置: 首页 > 知识库问答 >
问题:

如何从属性中读取可变数量的@刚需映射路径

彭博厚
2023-03-14

在Spring(Boot)中,我可以使用${...}语法将注释值外部化为应用程序/环境属性:

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

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

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

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

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

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

@RequestMapping(???)

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

对于单个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]:--}"
)

共有3个答案

袁帅
2023-03-14

您可以尝试创建HandlerMapping来添加URL,这里只是一个使用simplerlhandlermapping

@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中的代码

太叔何平
2023-03-14

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

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

如果您正在使用@Get映射(或@刚需映射),您可以在控制器中这样做:

@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()
伍捷
2023-03-14

你试过这个吗?:

some:
  path:
    property: /one, /two

然后呢

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

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

 类似资料:
  • 下面两个属性有什么区别,什么时候用哪个?

  • 问题内容: 似乎mmap接口仅支持readline()。如果我尝试遍历对象,则会得到字符而不是完整的行。 逐行读取mmap文件的“ pythonic”方法是什么? 问题答案: 遍历an行的最简洁方法是 请注意,在Python 3的前哨参数必须是类型的,而在Python 2它需要一个(即,而不是)。

  • 问题内容: 我有一个非常简单的Spring WebSocket应用程序。但是,我正在尝试使用路径变量进行订阅以及消息映射。 我在下面发布了一个释义的示例。我希望注解会根据订阅者的身份返回给订阅者。即,to 应通知的订阅者,但我没有看到此行为。 值得注意的是,订阅文字作品。这是故意的吗?我是否缺少某些配置?还是这不是它的工作方式? 我对WebSockets或这个Spring项目还不太熟悉,所以在此先

  • 问题内容: 我正在使用SSH2。当我尝试通过设置属性时,这是正确的。但是,当我尝试使用获得相同的属性时,我什么也没有。 为什么?他们不一样吗? 当我使用时,我得到了这些: 似乎在休眠状态下进行会话。为什么? 问题答案: 是的,它们是不同的,在scriptlet中,您使用http会话隐式对象;在struts标签属性中,您引用通过OGNL检索的struts会话映射对象。您一无所获,只是因为它们与众不同

  • 我使用的是。我有一个类似的类。我有一个的。 null