首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

DWR Converter 機制深度解析:內置轉換器、選擇邏輯與自定義擴展實戰

     編輯:Java 相關知識

DWR 數據轉換核心:Converter

DWR (Direct Web Remoting) 實現 JavaScript 與 Java 對象雙向轉換,核心接口 org.directwebremoting.convert.Converter,內置 20+ 轉換器覆蓋常見類型。

內置轉換器速查表

名稱適用 Java 類型轉換器類
nullvoid, VoidNullConverter
enumEnumEnumConverter
primitive基本類型及包裝類PrimitiveConverter
bignumberBigInteger, BigDecimalBigNumberConverter
stringStringStringConverter
array基本類型數組ArrayConverter
mapMapMapConverter
collectionCollectionCollectionConverter
dateDate, Calendar, SQL Date/Time/TimestampDateConverter
dom/dom4j/jdom/xom各類 XML 文檔模型DOMConverter 等
servletServletConfig, HttpServletRequest 等ServletConverter
bean任意 JavaBeanBeanConverter
objectObject (兜底)ObjectConverter
hibernate2/3Hibernate 代理/持久化對象H2BeanConverter/H3BeanConverter
urlURLURLConverter
exceptionException/ThrowableExceptionConverter/MinimalistExceptionConverter

註冊於 dwr.xml:<converter id="date" class="org.directwebremoting.convert.DateConverter"/> → <convert converter="date" match="java.util.Date"/>

Converter 選擇邏輯

  1. 入參:BaseCallMarshaller 通過反射 method.getParameterTypes()[i] 獲取類型,查找 Converter Map
  2. 返回值:實際調用方法後,根據運行時返回對象類型 在 DefaultConverterManager.convertOutbound() 中動態確定

調用鏈路

所有 Converter 繼承 BaseV20Converter implements Converter,僅需實現兩方法:

  • Object convertInbound(Class paramType, InboundVariable data, InboundContext ctx):JS → Java
  • OutboundVariable convertOutbound(Object data, OutboundContext ctx):Java → JS

復雜類型遞歸轉換:如 {id:1, name:'A', blogs:[...]} → Person{int id; String name; String[] blogs} 經歷 bean → primitive → array 三層 Converter。

自定義 Converter 兩種模式

模式一:繼承 BaseV20Converter(完全控制)

參考 DateConverter:

  • convertInbound:解析字符串為 Date/Time/Timestamp/Calendar
  • convertOutbound:返回 new SimpleOutboundVariable("new Date(" + millis + ")", ctx, true) 生成 JS new Date() 代碼

模式二:繼承 BeanConverter/BasicObjectConverter(JSON 風格)

實現 getPropertyMapFromObject()、createTypeHintContext(),適合 JSON 庫輔助的對象序列化。

註冊與應用

<converter id="special" class="com.example.dwr.SpecialConverter"/>
<convert converter="special" match="com.example.model.SpecialObject"/>

最佳實踐建議

  1. 優先使用內置 Converter,覆蓋 95%+ 場景
  2. 自定義時務必閱讀源碼理解 InboundVariable/OutboundVariable 結構
  3. 保持 dwr.xml 獨立管理,不混雜在 Spring 配置中
  4. 單元測試覆蓋轉換邊界情況(null、空集合、巢狀對象、循環引用)

參考資源

  • DWR 2.0.5 源碼
  • 《DWR 實戰》(側重業務用法,內部原理較少)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved