【问题标题】:Using String array "constant" in Spring @RequestMapping value在 Spring @RequestMapping 值中使用字符串数组“常量”
【发布时间】:2013-03-25 17:19:23
【问题描述】:

我可能应该指出,Spring 本身对这个问题并不一定至关重要,但是我在使用 Spring 时遇到了这种行为,所以这个问题使用了我在 Spring 中遇到的情况。

我有一个控制器类,它将对 GETPOST 请求的请求映射到特定表单的同一组 URL。此表单针对不同的语言环境有不同的 URL,但对于 GET 请求只有一种方法,而对于 POST 请求只有一种方法,因为表单的控制器级别的逻辑对于每个语言环境站点都是相同的(但更深层次的事情在逻辑中,例如特定于区域设置的验证,可能会有所不同)。示例:

@Controller
public class MyFormController {

    // GET request
    @RequestMapping(value={"/us-form.html", "/de-form.html", "/fr-form.html"},
            method={RequestMethod.GET})
    public String showMyForm() {
        // Do some stuff like adding values to the model
        return "my-form-view";
    }

    // POST request
    @RequestMapping(value={"/us-form.html", "/de-form.html", "/fr-form.html"},
            method={RequestMethod.POST})
    public String submitMyForm() {
        // Do stuff like validation and error marking in the model
        return "my-form-view"; // Same as GET
    }
}

GETPOST 的形式在这样编写时工作得很好。您会注意到用于@RequestMapping 值的String 数组是相同的。我想要做的是将这些 URL 放在一个位置(最好是控制器中的 static final 字段),这样当我们添加新 URL(对应于未来本地化站点中的表单)时,我们可以将它们添加到一个位置.所以我尝试对控制器进行这种修改:

@Controller
public class MyFormController {

    // Moved URLs up here, with references in @RequestMappings
    private static final String[] MY_URLS =
            {"/us-form.html", "/de-form.html", "/fr-form.html"};

    // GET request
    @RequestMapping(value=MY_URLS, // <-- considered non-constant
            method={RequestMethod.GET})
    public String showMyForm() {
        // Do some stuff like adding values to the model
        return "my-form-view";
    }

    // POST request
    @RequestMapping(value=MY_URLS, // <-- considered non-constant
            method={RequestMethod.POST})
    public String submitMyForm() {
        // Do stuff like validation and error marking in the model
        return "my-form-view"; // Same as GET
    }
}

这里的问题是编译器抱怨value 属性不再是一个常量。我知道 Spring 要求 value 必须是一个常量,但我曾认为将 final 字段(或在我的情况下为 static final)与包含 String 文字的 Array 文字一起使用会传递为“持续的”。我的怀疑是,数组文字必须以这样一种方式动态构建,即在解析 value 属性时它不会被初始化。

我觉得用基本的 Java 知识来弄清楚这不应该是一件难事,但是有些东西让我无法理解,经过一些研究我无法找到任何答案。有人可以证实我的怀疑并给出一个引用或很好的解释来解释为什么会这样,或者否认我的怀疑并解释实际问题是什么?

注意:我不能简单地将这些 URL 组合成一个 Path Pattern,因为每个表单 URL 都使用其本地化站点的语言,并且不可能进行匹配。例如,我只是将上面的“/{locale}-form.html”字符串作为我的 URL。

【问题讨论】:

标签: java spring controller constants


【解决方案1】:

你说得对,这和Spring无关,所有的Annotation参数都必须是编译时常量。这是基本的 java 语言规则。

将数组引用标记为 final 并不能削减它,因为这仍然是完全合法的:

MY_URLS[0] = "es-form.html";

另外,您最初是如何将语言环境嵌入到 url 中的?您是否在模拟旧链接? Spring 为使用浏览器的实际语言环境提供了大量内置支持。

【讨论】:

  • 关于MY_URLS[0] 的好点,应该考虑到它的含义(我最近一直在深入JavaScript 领域)。不幸的是,我被锁定在使用特定于语言环境的 URL,因为我们正在为其编写此代码的客户需要它,并且更改它们(如果可能的话)将是一个费力的过程(主要是在客户方面,但我们可能会从那个过程中得到某种形式的悲伤)。我们还有几个遵循此约定的表单 URL,它们已经或即将上线,在最后一刻更改不会有任何乐趣。
猜你喜欢
  • 2020-11-07
  • 2020-02-01
  • 2010-12-21
  • 2015-05-21
  • 2012-12-13
  • 1970-01-01
  • 2012-04-22
  • 2011-03-10
  • 2019-07-29
相关资源
最近更新 更多