首页 > 解决方案 > url中的Spring-boot位置变量

问题描述

我正在尝试设置我的网站以允许向网址添加位置。EG:mysite.com/us/ca/sanfrancisco/home 同时还允许 mysite.com/home 以及介于两者之间的所有内容。

Spring boot parent,所以您知道我使用的是什么版本的 spring:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
</parent>

如果您需要其他版本控制,请告诉我。

我知道我可以将正则表达式变量添加到请求映射中,但是我将如何在更多请求中保留这些 url?

所以现在举个例子,我的测试错误页面:

    @RequestMapping({"/error/501", "/{state:[a-z]{2}}/error/501", "/{state:[a-z]{2}}/{city:[a-z]+}/error/501"})
    public ModelAndView testingLocations(ModelMap model, @PathVariable(value="state", required = false) String state,
                                         @PathVariable(value="city", required=false) String city){
        getLogger().info("State: {}", state);
        model.addAttribute("stateTest",state+":"+city);
        model.addAttribute("view", "error");
        return new ModelAndView("error/501", model);
    }

但是当我在我的测试页面上,我点击主页按钮时,它会带我回到 mysite.com/home

所以我的问题

有没有办法让我坚持下去,以便如果他们目前在基于位置的 url 上,它将把该基础应用于未来的导航?(除非他们手动输入网址以不包括它们)

然后作为后续,有没有办法让我全局应用这些请求变量,而不需要我将 @PathVariable 添加到每个请求映射方法?我知道我可以将请求映射变量字符串本身添加到控制器类中,这样我就不需要每个方法上的那些。但是有没有办法让我在不需要 @PathVariable 注释的情况下使用它们?

最后,有没有办法让我不那么硬编码,就像我说 /{*location}/error 覆盖尽可能深的位置?虽然仍然对位置格式进行验证,所以验证 1 我们支持给定的位置,2 格式正确(/ca/sanfrancisco vs /anything/anything

我可以忍受的最后一个,如果我需要 /state/city/municipality/actualtarget 至于验证我们是否支持给定的位置,我知道那是我的目标,我可能只有一个小型数据库跟踪我们在哪里支持和不支持给定的变量。

是否有构建此系统的最佳实践?我试图在这方面找到一些东西,但是谷歌搜索“spring boot location url”并不是最好的给我我需要的东西,因为“位置”可以适用于相当广泛的主题。我已经通过搜索到达了我所在的位置,但我似乎无法确定最后几个步骤。

任何帮助/建议/建议表示赞赏。如果需要升级版本,我不确定目前是否可行,我必须研究一下。最好我希望解决方案能够在我正在运行的当前 spring 版本上完成。

标签: javaspringspring-boot

解决方案


这里最好的方法是:

@RequestMapping("/some/{foo}/{baz}")
public String hi(CompositeObject compositeObject) {
   return "hi";
}

@Data
public class CompositeObject {
    private String foo;
    private String baz;
}

Spring 提供了请求路径和请求参数的功能,以将其收集到复合对象中。它不适用于正文或标题。

If you have something optional like state, then just keep it null at the controller and handle later


推荐阅读