在Spring Framework中将@Value注释与静态最终变量一起使用

Jap*_*edi 2 spring spring-mvc spring-el spring-3

我想使Spring应用程序中的请求映射动态化。这样我的网址就无法理解了。而且我可以向用户显示任何无意义的内容,并且仍然可以解决映射的目的。

为此,我将URL的动态部分存储在属性文件中。并希望在@RequestMapping注释中使用它。同样的事情将在JSP的客户端上完成。我将从属性文件中读取值,然后创建href。

我正在使用@Value注释读取属性文件的值。

有一个类将所有此类值保存在最终的静态变量中。

public class UrlMappingAbstraction {
    public static final @Value("#{urlAbstractionProperties['url.message']?:'message'}") String MESSAGE = "";
}
Run Code Online (Sandbox Code Playgroud)

我在控制器中扩展此类,并在@RequestMapping注释中使用static final字段,如下所示。

@RequestMapping(value="/"+MESSAGE+"/{id}", method=RequestMethod.GET)
Run Code Online (Sandbox Code Playgroud)

而且在jsp中,我还使用<spring:message/>并在href中生成url 来从属性文件中读取值。

问题是jsp能够基于属性文件值创建正确的url,但是在@RequestMapping批注中我的值没有被替换。

有人可以告诉我确切的问题吗?我知道初始化后我们无法更改静态最终变量的值。那么@Value注释的用途是什么。

如果可以通过其他方法完成,那么您也可以向我展示。

提前致谢。

axt*_*avt 5

注解本质上是静态的,因此您不能以这种方式这样做。

@Value不能在static字段上使用,但这无关紧要-真正的问题是,除了编译时间常数作为注释的属性外,没有其他方法可以使用值。

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

  • 添加URL重写过滤器(例如thisthis)并将其配置为执行必要的转换。

    由于职责分工明确,这种方法看起来更优雅-控制器负责完成工作,重写过滤器负责URL的混淆。

  • RequestMappingHandlerMapping. getMappingForMethod()在此步骤中通过覆盖并更改其URL模式来拦截控制器映射的创建(未测试)