在Spring Framework中使用@Value注释和静态最终变量

时间:2013-01-21 12:57:34

标签: spring spring-mvc spring-3 spring-el

我想在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注释的用途是什么。

如果可以通过其他方式完成,那么您也可以告诉我。

提前致谢。

2 个答案:

答案 0 :(得分:4)

注释本质上是静态的,因此你不能这样做。

@Value不能在static字段上使用,但这并不重要 - 真正的问题是没有办法使用编译时常量以外的值作为注释的属性

您可以使用以下替代方案之一:

  • 添加网址重写过滤器(例如thisthis)并对其进行配置以执行必要的转换。

    由于职责明确分离,这种方法看起来更优雅 - 控制器负责完成工作,重写过滤器负责对网址进行模糊处理。

  • 通过覆盖RequestMappingHandlerMapping. getMappingForMethod()拦截控制器映射的创建,并在此步骤更改其网址格式(未经测试)

答案 1 :(得分:0)

我会通过说你应该反过来来增加@ axtavt的建议。您真的需要使消息URL运行时可配置吗?

如果你不只是制作一个静态变量,就像你拥有它一样但没有@Value

public final class UrlMapping {
    public static final String MESSAGE = "message";
}

然后在您的JSP中引用UrlMapping.MESSAGE而不是属性文件。

虽然它不那么灵活,但它更简单,恕我直言,使端点URL太可配置是一个坏主意,因为你不可避免地会在Javascript或模板中硬编码。改变URL也不利于SEO。