使动作属性从空字符串参数设置为null

时间:2013-05-15 13:52:07

标签: struts2

我的目标是,如果由于请求参数为空字符串而设置了属性属性为null。

我创建了一个在默认堆栈之前运行的拦截器,它将invocation.getInvocationContext().getParameters()中的所有值修剪为null。但是,这并没有解决我的问题;尽管参数现在为null(在使用ParameterAware的操作中验证),但属性仍被设置为空字符串。

进一步阅读后,我发现parameters interceptor可能是原因,特别是:

  

在调用此拦截器时,会打开一个标志(ReflectionContextState#CREATE_NULL_OBJECTS)以确保自动创建任何空引用 - 如果可能的话。有关详细信息,请参阅类型转换文档和InstantiatingNullHandler javadoc。

有没有简单的方法来实现我的目标?

如果情况变得更糟,似乎可以扩展ParametersInterceptor类,并覆盖方法doIntercept(ActionInvocation invocation)setParameters(Object action, ValueStack stack, final Map<String, Object> parameters)。对于我认为,许多人会想要的行为,这似乎令人难以置信的尴尬。

2 个答案:

答案 0 :(得分:2)

我认为太多人不会真正想要这种行为,因为它基本上颠覆了正常的HTTP参数行为,其中未填充的参数是空字符串。

您有几个选择。

您可以尝试替换或扩展StrutsObjectFactory。您可以尝试替换或扩展InstantiatingNullHandler。这两个都在struts-default.xml中配置,应该可以轻松覆盖。

但是,我可能采取不同的方法,因为您基本上要求解决HTTP问题,并在输入为空时注释应该生成null的操作字段。在“参数”之后运行的拦截器将根据操作的属性和注释检查参数,并在适当时将其清空。

这个想法有很多变化,你可能只有一个有地图的动作,而“null”参数用地图条目表示。这样可以避免注释和方法查找(尽管可以在类名上缓存),但会牺牲一些额外的代码。

答案 1 :(得分:0)

您可以尝试在ParametersInterceptor之前将此RemoveEmptyParametersInterceptor添加到拦截器堆栈。

对我来说效果很好。