Java 有没有办法将Struts配置为绑定null而不是空字符串?

Java 有没有办法将Struts配置为绑定null而不是空字符串?,java,web-applications,struts-1,Java,Web Applications,Struts 1,当用户决定将表单中的字段保留为空时,Apache Struts将空字符串绑定为ActionForm中属性的值。有没有办法全局修改行为并选择null而不是空的String 我知道Spring MVC的功能与此完全相同,但也可以注册为属性编辑器,将字符串修剪为null在ActionForm中默认声明字符串值为null例如:private String str=null 编辑:此问题的解决方案是。 我认为对于该属性,您有setter和getter方法,在getter方法中检查值是否为空,然后明确地设置

当用户决定将表单中的字段保留为空时,Apache Struts将空
字符串
绑定为
ActionForm
中属性的值。有没有办法全局修改行为并选择
null
而不是空的
String


我知道Spring MVC的功能与此完全相同,但也可以注册为属性编辑器,将字符串修剪为
null

在ActionForm中默认声明字符串值为
null

例如:private String str=null

编辑:此问题的解决方案是。 我认为对于该属性,您有setter和getter方法,在getter方法中检查值是否为空,然后明确地设置为null值

参见Apache的方法


至于配置,Struts没有给我们提供这种功能(我不记得了)。我会建议重写
ActionForm
中的
reset()
方法,但这是在控制器重新填充表单bean之前调用的。

一个可能的解决方案是注册一个自定义转换器,但不是用Struts,而是用Struts

为了将请求参数映射到表单属性,Struts使用。这个类依次使用
BeanUtils
实现来完成它的工作

一个简单化的流程类似于Struts'>>>>

有趣的是还有一个从字符串转换为。。。AAAA。。。绳子

可用于注册转换器、覆盖现有转换器的方法。这意味着您可以自己编写自定义字符串转换器,该转换器为空字符串返回null,然后您可以等待Struts应用程序完全加载,这样您就不会感到意外(即,确保您的转换器是上次注册的
字符串

加载应用程序后,您可以介入并用自己的实现覆盖默认字符串转换器。例如,您可以使用,并在
contextInitialized
方法中调用
ConvertUtils.register(…)


然后在
web.xml
中配置侦听器,然后您就可以了。

我认为您最好使用自己的BeanUtils实现,覆盖类,在web.xml中使用下面的代码

<init-param>
      <param-name>convertNull</param-name>
      <param-value>true</param-value>
</init-param>

转换零
真的
Cf 对于convertNull;-)


convertNull-填充表单时强制模拟版本1.0的行为。如果设置为“true”,则数值Java包装器类类型(如Java.lang.Integer)将默认为null(而不是0)。(从1.1版开始)[false]

这是一个老问题,但我通过实现另一个解决方案解决了这个问题(我认为更简单)

我实现了一个
TypeConverter
来将空字符串转换为null。 需要两个文件:

转换器

public class StringEmptyToNullConverter implements TypeConverter {

    private static final Logger log = LoggerFactory.getLogger(StringEmptyToNullConverter.class);

    @Override
    public Object convertValue(Map arg0, Object arg1, Member member, String arg3, Object obj, Class arg5) {
        String[] value = (String[]) obj;
        if (value == null || value[0] == null || value[0].isEmpty()) {
            logDebug("is null or empty: return null");
            return null;
        }
        logDebug("not null and not empty: return '{}'", value[0]);
        return value[0];
    }

    private void logDebug(String msg, Object... obj) {
        if (log.isDebugEnabled()) {
            log.debug(msg, obj);
        }
    }
}
以及名为
xwork conversion.properties
的寄存器。您必须将此文件放在java路径中

# syntax: <type> = <converterClassName>
java.lang.String = StringEmptyToNullConverter
#语法:=
java.lang.String=StringEmptyToNullConverter

请参阅struts,struts 2提供了一个很好的拦截机制,我认为这比使用BeanUtils更安全、更容易。以下是我使用的代码,基于Java 7,但经过编辑以用Java 7编译(原始代码来自2009年):

import com.opensymphony.xwork2.ActionContext;
导入com.opensymphony.xwork2.ActionInvocation;
导入com.opensymphony.xwork2.interceptor.interceptor;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.Map;
导入org.apache.commons.lang.ArrayUtils;
导入org.apache.commons.lang.StringUtils;
公共类RemoveEmptyParametersInterceptor实现拦截器{
public removeMptyparametersinterceptor(){
超级();
}
/**
*@see com.opensymphony.xwork2.interceptor.interceptor#destroy()
*/
公共空间销毁(){
//无事可做。
}
/**
*@see com.opensymphony.xwork2.interceptor.interceptor#init()
*/
公共void init(){
//无事可做。
}
公共字符串截获(最终ActionInvocation调用)引发异常{
最终字符串结果;
final ActionContext ActionContext=invocation.getInvocationContext();
最终映射参数=actionContext.getParameters();
if(参数==null){
//无事可做。
}否则{
最终收集参数storemove=new ArrayList();
对于(最终Map.Entry:parameters.entrySet()){
最终对象=entry.getValue();
if(字符串的对象实例){
最终字符串值=(字符串)对象;
if(StringUtils.isEmpty(值)){
参数storemove.add((字符串)entry.getKey());
}
}else if(字符串[]的对象实例){
最终字符串[]值=(字符串[])对象;
最终对象[]对象=
ArrayUtils.removeElement(值为“”);
如果(objects.length==0){
参数storemove.add((字符串)entry.getKey());
}
}否则{
抛出新的IllegalArgumentException();
}
}
for(最终字符串参数ToRemove:parametersToRemove){
参数。删除(参数删除);
}
}
结果=invocation.invoke();
返回结果;
}
}
下面是我如何在struts.xml文件中使用它:

<package name="webdefault" namespace="/" extends="struts-default">
      <interceptors>
        <interceptor name="removeEmptyParameters" class="com.sentrylink.web.struts.RemoveEmptyParametersInterceptor"/>
        <interceptor-stack name="webStack">
            <interceptor-ref name="removeEmptyParameters"/>
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>
      </interceptors>

     <default-interceptor-ref name="webStack"/>
     ...
</package>

...
有人向我指出,原始问题中的ActionForm是一个Struts 1约定(该问题已被正确标记),但由于谷歌仍将Struts 2查询带到这里,我希望这个答案对其他人有用。

根据定义(html表单
<package name="webdefault" namespace="/" extends="struts-default">
      <interceptors>
        <interceptor name="removeEmptyParameters" class="com.sentrylink.web.struts.RemoveEmptyParametersInterceptor"/>
        <interceptor-stack name="webStack">
            <interceptor-ref name="removeEmptyParameters"/>
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>
      </interceptors>

     <default-interceptor-ref name="webStack"/>
     ...
</package>