dwr 不能使用复杂类型参数的解决办法
来源:互联网 发布:淘宝订单怎么查发票 编辑:程序博客网 时间:2024/05/17 13:12
最近接手了一个项目的维护,客户端和服务器间的通信用的是dwr,在增加功能时,突然发现服务器端收到的参数与期望值不一致。比如:
我提供的方法参数为:{TID="PNW20201407070001", DETAILS=[{DNDNUM=3, DNDID=1, DDID="tddetail20140707154558501"}], wfid=21519, opinion="发货中", CDID="DNW20201407070003"},
收到的却是:{TID="PNW20201407070001", DETAILS="[reference:c0-e6]", wfid="21519", opinion="发货中", CDID="DNW20201407070003"}
存在的问题有:1)子对象没有被解析出来,2)非字符串属性被解析为字符串
跟踪dwr的engine.js,发现参数是被完全解析的,是服务器端解析出了问题。在网上搜索此问题,没有发现解决方法。有网友用json,但这样增加了客户端json的打包和服务器端的json解包,大大降低了dwr的使用意义。
结果一番探索,终于解决了这个问题,在此分享给大家,以感谢无数愿意分享技术的网友。
1.重载DefaultConverterManager:
package com.nantian.common.service;import java.sql.Date;import java.util.ArrayList;import java.util.HashMap;import org.directwebremoting.dwrp.DefaultConverterManager;import org.directwebremoting.extend.InboundContext;import org.directwebremoting.extend.InboundVariable;import org.directwebremoting.extend.MarshallException;import org.directwebremoting.extend.TypeHintContext;public class ComplexConverterManager extends DefaultConverterManager {@Overridepublic Object convertInbound(Class paramType, InboundVariable iv, InboundContext inctx, TypeHintContext incc) throws MarshallException {Class type = null;if(paramType==Object.class)//解析dwr类型数据type = getExtraTypeInfo(iv.getType(), iv.getValue());return super.convertInbound(type!=null ? type : paramType, iv, inctx, incc);}/** * 根据数据解析类型 * @param type 数据类型串 * @param value 数据值 * @return 类型 */private Class getExtraTypeInfo(String type, String value){if(type.equalsIgnoreCase("string"))return String.class;if(type.equalsIgnoreCase("boolean"))return Boolean.class;if(type.equalsIgnoreCase("number")){if(value.indexOf('.') > -1 || value.indexOf('e') > -1 || value.indexOf('E') > -1)return Double.class;Long lv = new Long(value);return lv.longValue()==lv.intValue() ? Integer.class : Long.class;}if(type.equals("Date"))return Date.class;if(type.equals("Array"))return ArrayList.class;if(type.equals("Object_Object"))return HashMap.class;if(type.equals("default"))return String.class;return null;}@Overridepublic Class getExtraTypeInfo(TypeHintContext thc) {Class type = super.getExtraTypeInfo(thc);//将不能识别的类型标记为Object型,以免被TypeHintContext置为String型return type!=null ? type : Object.class;}}
2.加载ComplexConverterManager:
在web.xml的servlet:dwr-invoker中,增加初始化参数:
<init-param><param-name>org.directwebremoting.extend.ConverterManager</param-name><param-value>com.nantian.common.service.ComplexConverterManager </param-value></init-param>
如此,客户端的复杂Object或Array对象就可以顺利传递到服务器端了
0 0
- dwr 不能使用复杂类型参数的解决办法
- 类型列表不是通用的,它不能被参数化和参数< databaseSource >解决办法
- DWR不能得到CDI注入bean的一个解决办法
- dwr 使用接口作方法的参数
- dwr 使用接口作方法的参数
- ASP.NET - Web API,从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法
- 类型 List 不是通用的;不能使用参数 <String> 将它参数化
- 使用 SharedPreferences 存取复杂类型的数据
- 使用SharedPreferences保存复杂类型的数据
- vmvare 不能使用的解决办法
- cocoapod不能使用的解决办法
- WCF复杂类型参数传输
- 不能做switch()的参数类型
- rails中weill_paginate的paginate方法中不能使用额外参数的解决办法
- 为什么类型参数不能作为静态变量的类型
- 复杂的变量类型
- 复杂的变量类型
- DWR提供的注解类型
- Android开发之ExpandableListView
- 浅谈C的函数应用
- 华为荣耀X1相机或图库图标被删除后的恢复方法(不需要恢复出厂设置)!
- iOS 之美:iOS Delegate 使用五步曲
- 在主函数中输入5个的字符串。用另一个函数对它们排序,然后主函数输出5个已经排好的字符串
- dwr 不能使用复杂类型参数的解决办法
- C++内联函数
- kendo ui 编辑数据点击取消grid数据减少原因及处理方案
- 灾害培训救护培训与考核
- 汲簿只毯椒栋吞妒敝椒缓
- c语言必会习题
- KMP算法 KMP模式匹配 二(串)
- xinetd是什么
- 赶时髦过了一遍Swift 语言....