3

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

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

进一步阅读后,我发现参数拦截器可能是原因,特别是:

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

有没有一些简单的方法可以实现我的目标?

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

4

2 回答 2

2

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

你有几个选择。

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

但是,我可能会采用不同的方法,因为您基本上是在要求解决 HTTP,并注释null在输入为空时应执行的操作字段。在“参数”之后运行的拦截器将根据操作的属性和注释检查参数,并酌情将它们归零。

这个想法有很多变体,您可能只有一个具有映射的操作,并且“空”参数由映射条目指示。这避免了注解和方法查找(尽管可以缓存在类名上),但代价是一些额外的代码。

于 2013-05-15T15:43:35.977 回答
0

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

它对我来说效果很好。

于 2014-04-08T15:11:33.810 回答