我的目标是,如果由于请求参数为空字符串而设置了属性属性为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)
。对于我认为,许多人会想要的行为,这似乎令人难以置信的尴尬。
答案 0 :(得分:2)
我认为太多人不会真正想要这种行为,因为它基本上颠覆了正常的HTTP参数行为,其中未填充的参数是空字符串。
您有几个选择。
您可以尝试替换或扩展StrutsObjectFactory。您可以尝试替换或扩展InstantiatingNullHandler。这两个都在struts-default.xml
中配置,应该可以轻松覆盖。
但是,我可能采取不同的方法,因为您基本上要求解决HTTP问题,并在输入为空时注释应该生成null
的操作字段。在“参数”之后运行的拦截器将根据操作的属性和注释检查参数,并在适当时将其清空。
这个想法有很多变化,你可能只有一个有地图的动作,而“null”参数用地图条目表示。这样可以避免注释和方法查找(尽管可以在类名上缓存),但会牺牲一些额外的代码。
答案 1 :(得分:0)
您可以尝试在ParametersInterceptor之前将此RemoveEmptyParametersInterceptor添加到拦截器堆栈。
对我来说效果很好。