我想在Spring应用程序中动态生成Request Mappings。所以我的网址无法理解。我可以向用户显示任何无意义的内容,并且仍然可以解决映射目的。
为此,我将URL的动态部分存储在属性文件中。并希望在@RequestMapping
注释中使用它。在JSP中,客户端也将完成同样的事情。我将从属性文件中读取值,然后创建href。
我使用@Value
注释来读取属性文件值。
有一个类在最终的静态变量中保存所有这些值。
public class UrlMappingAbstraction {
public static final @Value("#{urlAbstractionProperties['url.message']?:'message'}") String MESSAGE = "";
}
我正在我的控制器中扩展这个类,并使用@RequestMapping注释中的静态final字段,如下所示。
@RequestMapping(value="/"+MESSAGE+"/{id}", method=RequestMethod.GET)
在jsp中我也使用<spring:message/>
从属性文件中读取值并在href中生成url。
问题是jsp能够根据属性文件值创建正确的url,但在@RequestMapping注释中我的值不会被替换。
有人能告诉我确切的问题吗?我知道在初始化之后我们无法改变静态最终变量的值。那么@Value注释的用途是什么。
如果可以通过其他方式完成,那么您也可以告诉我。
提前致谢。
答案 0 :(得分:4)
注释本质上是静态的,因此你不能这样做。
@Value
不能在static
字段上使用,但这并不重要 - 真正的问题是没有办法使用编译时常量以外的值作为注释的属性
您可以使用以下替代方案之一:
添加网址重写过滤器(例如this或this)并对其进行配置以执行必要的转换。
由于职责明确分离,这种方法看起来更优雅 - 控制器负责完成工作,重写过滤器负责对网址进行模糊处理。
通过覆盖RequestMappingHandlerMapping. getMappingForMethod()
拦截控制器映射的创建,并在此步骤更改其网址格式(未经测试)
答案 1 :(得分:0)
我会通过说你应该反过来来增加@ axtavt的建议。您真的需要使消息URL运行时可配置吗?
如果你不只是制作一个静态变量,就像你拥有它一样但没有@Value
:
public final class UrlMapping {
public static final String MESSAGE = "message";
}
然后在您的JSP中引用UrlMapping.MESSAGE而不是属性文件。
虽然它不那么灵活,但它更简单,恕我直言,使端点URL太可配置是一个坏主意,因为你不可避免地会在Javascript或模板中硬编码。改变URL也不利于SEO。