Struts 2 предлагает хороший механизм для этого с перехватчиками, который, я думаю, намного безопаснее и проще, чем копаться с BeanUtils
. Вот код, который я использовал, основанный на блоге Cimballi , но отредактированный для компиляции в Java 7 (оригинал был с 2009 года):
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
public class RemoveEmptyParametersInterceptor implements Interceptor {
public RemoveEmptyParametersInterceptor() {
super();
}
/**
* @see com.opensymphony.xwork2.interceptor.Interceptor#destroy()
*/
public void destroy() {
// Nothing to do.
}
/**
* @see com.opensymphony.xwork2.interceptor.Interceptor#init()
*/
public void init() {
// Nothing to do.
}
public String intercept(final ActionInvocation invocation) throws Exception {
final String result;
final ActionContext actionContext = invocation.getInvocationContext();
final Map<String, Object> parameters = actionContext.getParameters();
if (parameters == null) {
// Nothing to do.
} else {
final Collection<String> parametersToRemove = new ArrayList<String>();
for (final Map.Entry entry : parameters.entrySet()) {
final Object object = entry.getValue();
if (object instanceof String) {
final String value = (String) object;
if (StringUtils.isEmpty(value)) {
parametersToRemove.add((String) entry.getKey());
}
} else if (object instanceof String[]) {
final String[] values = (String[]) object;
final Object[] objects =
ArrayUtils.removeElement(values, "");
if (objects.length == 0) {
parametersToRemove.add((String) entry.getKey());
}
} else {
throw new IllegalArgumentException();
}
}
for (final String parameterToRemove : parametersToRemove) {
parameters.remove(parameterToRemove);
}
}
result = invocation.invoke();
return result;
}
}
А вот как я использую его в моем файле 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 (вопрос с тех пор был правильно помечен), но, поскольку Google все еще переносит его сюда с запросом Struts 2, я надеюсь, что этот ответ будет кому-то полезен еще.