struts2 表单参数带有“.”异常 解决方法

一直很少把日志级别调到info,除非调试需要,今天突然发现struts2抛如下异常,原因到是很简单,主要是表单提交的name中含有特殊字符“.”,struts2会自动去匹配用“.”分隔的对象,问题是我做的平台中很多自定义动态查询条件都含有“.”,我不可能因为这个去重写框架逻辑

2013-09-17 11:49:18,824 [com.opensymphony.xwork2.ognl.OgnlValueStack]-[WARN] Error setting expression '_order.names' with value '[Ljava.lang.String;@6ad0ca6f'
ognl.OgnlException: target is null for setProperty(null, "names", [Ljava.lang.String;@6ad0ca6f)

下面给出最简单的解决方法,我平台中用到了struts2的拦截器,直接在第一个拦截器中把struts2的Parameters过滤一遍即可,下面是具体的代码,放在struts2过滤器的最上面:

public String intercept(ActionInvocation invocation) throws Exception {
  log.info("1.struts2进入分析拦截器!");
  
  ActionContext actionContext = invocation.getInvocationContext();
  Map<String, Object> paramMapNew = new HashMap<String, Object>();
  Map<String, Object> paramMap = actionContext.getParameters();
  Set<String> paramMapKey = paramMap.keySet();
  for (String key : paramMapKey) {
   if(!key.startsWith("_query") && !key.startsWith("_order")){
    paramMapNew.put(key, paramMap.get(key));
   }
  }
  actionContext.setParameters(paramMapNew);

.........

逻辑很简单,struts2是用的自身的Parameters去封装的实体对象,拿到他的Parameters过滤一遍,把自己想要剔除的带“.”的参数去掉即可

你可能感兴趣的:(error,struts2,null,for,target,expression,setProperty,setting,is)