Java 有没有办法将Struts配置为绑定null而不是空字符串?
当用户决定将表单中的字段保留为空时,Apache Struts将空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方法中检查值是否为空,然后明确地设置
字符串
绑定为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>