6

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

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

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

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

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

我正在我的控制器中扩展这个类,并使用@RequestMapping 注释中的静态最终字段,如下所示。

@RequestMapping(value="/"+MESSAGE+"/{id}", method=RequestMethod.GET)

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

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

谁能告诉我确切的问题?我知道我们不能在初始化后更改静态最终变量的值。那么@Value注解有什么用。

如果这可以通过其他方式完成,那么你也可以给我看。

提前致谢。

4

2 回答 2

6

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

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

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

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

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

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

于 2013-01-21T14:01:04.530 回答
0

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

如果您不只是像拥有它一样创建一个静态变量,但没有@Value

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

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

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

于 2013-01-21T14:15:14.043 回答