【问题标题】:Struts2 Converting Enum Array fills array with single null valueStruts2 转换枚举数组用单个空值填充数组
【发布时间】:2011-03-04 02:45:04
【问题描述】:

对于具有这些成员变量的简单动作类:

...
private TestConverterEnum test;
private TestConverterEnum[] tests;
private List<TestConverterEnum> tList;
...

还有一个简单的枚举:

public enum TestConverterEnum {
    A,
    B,
    C;
}

使用默认的struts2枚举转换,当我这样发送请求时:

TestConterter.action?test=&tests=&tList=&b=asdf

对于test,我得到一个null 值,这是预期的。但是,对于 Array 和 List,我得到一个带有一个 null 元素的 Array(或列表)。这是预期的吗?有没有办法防止这种情况发生。

我们最近升级了我们的struts2版本,我们有自己的转换器,在这种情况下也不起作用,所以我希望使用默认的转换方法。我们已经有代码验证这些数组的null 和长度,我不想在这些分支中添加另一个条件。有没有办法防止这种行为?

【问题讨论】:

    标签: java struts2 type-conversion


    【解决方案1】:

    是的,这是 IMO 的预期行为。

    Http 参数原则上是多值的(通常用于多值选择列表中),因此 struts2 参数拦截器(通过反射)要求接受数组或(作为第二个选项)单个值的设置器。你的动作可能有一个setTests(TestConverterEnum[] a) setter,所以,当 Struts2 的拦截器必须映射 tests= 时,他找到了那个 setter,然后自己想:“我必须用一个数组来设置这个 'tests' 属性,让我们看看如何传递了许多参数...只有一个(空),然后让我们创建一个长度为 1 的数组并用转换填充它..." 等等。

    我认为这是合理的:您的请求包含一个“测试”参数(虽然是空的),因此创建了一个单一大小的数组。

    我敢打赌,如果您尝试TestConterter.action?tests=&amp;tests=,将会创建一个长度为 2 的数组。

    更新

    让我们看看我们是否同意这一点:在请求中传递一个空参数(原则上)与不传递它相同......尽管经常有人希望将这两种情况都视为等价的。

    如果你想告诉 Struts2:“完全忽略空参数”...我不认为(假设这是一个可以接受的想法)这种行为可以由一些全局的环境。 您总是可以编写自己的拦截器(或扩展 Parameters 拦截器),以便在映射之前清除请求中的空参数。

    顺便说一句,请注意这个问题与枚举或数组无关,完全是一般性的。

    现在,多值参数的情况需要额外考虑。我假设如果您的 Action 具有数组类型的公共属性,那是因为它可以使用多个参数进行设置(通常是 SELECT MULTIPLE) - 如果没有,这里存在一些设计问题。 现在,您对此请求的预期行为是什么?

    TestConterter.action?tests=&tests=A&tests=&tests=B&tests=B
    

    这应该生成一个长度为 5 [null, A, null, B, B] 或 3 [A, B, B] 或 2 [A, B] 的数组还是什么? 很难给出一般标准;这就是为什么通常在你的 setter 方法中更好地处理这个问题。

    【讨论】:

    • 这对我来说似乎很奇怪,因为空的表单字段似乎很常见。这意味着为了查看我是否有一个有效值,我必须检查每个数组是否有: array != null && array.length > 0 && //每个元素都不为空。对我来说似乎是。没有办法解决吗?
    猜你喜欢
    • 2018-06-21
    • 2013-01-17
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2012-02-15
    相关资源
    最近更新 更多