2

我可能应该指出,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工作得很好。您会注意到String用于@RequestMapping值的数组是相同的。我想要做的是将这些 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在我的情况下)将作为“常量”传递。我在这里的怀疑是,数组文字必须以这样一种方式动态构建,即在解析属性时它不会被初始化。ArrayStringvalue

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

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

4

1 回答 1

6

没错,这和 Spring 无关,所有的 Annotation 参数都必须是编译时常量。这是一个基本的java语言规则。

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

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

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

于 2013-03-25T17:27:31.547 回答