2010-06-15 41 views
0

阵列对于一个简单的动作类与这些成员变量:Struts2的转换枚举阵列填充单空值

... 
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值,这是预期的。然而,对于数组和列表,我得到和数组(或列表)与一个空元素。这是预期的吗?有没有办法来防止这一点。

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

回答

2

是的,它预计行为国际海事组织。因此,struts2参数拦截器要求(通过反射)接受数组的设置器或(作为第二个选项)一个单一的值。这些参数在原理上是多值的(通常用在多值选择列表中),因此struts2参数拦截器要求(通过反射)接受数组的设置器。你的行动很可能有一个setTests(TestConverterEnum[] a)制定者,所以,当Struts2的拦截器必须映射tests=他创立的是二传,并认为自己:“我必须设置这个‘测试’属性与数组,让我们看到许多参数如何传递.. 。只有一个(空),然后让我们创建一个长度为1的数组,然后用换算符填充它。“等。

我觉得它是合理的:您的请求包含'tests'参数(尽管为空),因此创建了一个大小的数组。

我敢打赌,如果你试图TestConterter.action?tests=&tests=长度为2的阵列将被创建。

更新

让我们看看如果我们同意这种说法:传递一个空参数的请求(原则上)一样不及格吧...虽然经常一个人想将两种情况视为等同。

如果你想告诉Struts2:“完全忽略空参数” ......我不认为(假设这是一个可接受的想法),这种行为可以通过一些全局设置强制执行。 你总是可以编写自己的拦截器(或延长参数拦截器),因此它映射之前淘从请求空参数。

顺便说一句,注意,这个问题是无关的枚举或阵列,是完全通用。现在

,多值参数的情况下,需要额外考虑。我假设如果你的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方法的原因。

+0

对我来说,这似乎很奇怪,因为空的表单字段看起来很平常。这意味着为了查看我是否具有有效值,我必须检查每个数组:array!= null && array.length> 0 && //每个元素不为null。 它只是看起来给我。有没有办法解决它? – partkyle 2010-06-15 20:46:30

+0

我更新了我的答案 – leonbloy 2010-06-15 21:02:07