Bean 和 Object 轉換器
兩個沒有默認打開的轉換器是Bean 和 Object 轉換器。Bean轉換器可以把POJO轉換成Javascript的接合數組(類似與Java中的Map),或者反向轉換。這個轉換器默認情況下是沒打開的,因為DWR要獲得你的允許才能動你的代碼。

Object轉換器很相似,不同的是它直接應用于對象的成員,而不是通過getter和setter方法。下面的例子都是可以用object來替換bean的來直接訪問對象成員。

如果你有一個在 <create ...> 中聲明的遠程調用Bean。它有個一參數也是一個bean,并且這個bean有一個setter存在一些安全隱患,那么攻擊者就可能利用這一點。

你可以為某一個單獨的類打開轉換器:

<convert converter="bean" match="your.full.package.BeanName"/>
如果要允許轉換一個包或者子包下面的所有類,可以這樣寫:

<convert converter="bean" match="your.full.package.*"/>
顯而易見,這樣寫是允許轉換所有的JavaBean:

<convert converter="bean" match="*"/>
BeanConverter 和 JavaBeans 規范
用于被BeanConverter轉換的Bean必須符合JavaBeans的規范,因為轉換器用的是Introspection,而不是Reflection。這就是說屬性要符合一下條件:有getter和setter,setter有一個參數,并且這個參數的類型是getter的返回類型。setter應該返回void,getter應該沒有任何參數。setter沒有重載。以上這些屬于常識。如果你用的不是JavaBean,那么你應該用ObjectConverter.

設置Javascript變量
DWR可以把Javascript對象(又名maps,或聯合數組)轉換成JavaBean或者Java對象。

一個簡單的例子可以幫助你。假設你有下面的Java代碼:

public class Remoted {
  public void setPerson(Person p) {
    // ...
  }
}

public class Person {
  public void setName(String name) { ... }
  public void setAge(int age) { ... }
  // ...
}
如果這個Remoted已經被配置成Creator了,Persion類也定義了BeanConverter,那么你可以通過下面的方式調用Java代碼:

var p = { name:"Fred", age:21 };
Remoted.setPerson(p);
限制屬性轉換
就像你可以在creator的定義中剔出一些方法一樣,converter也有類似的定義。

限制屬性轉換僅僅對于Bean有意義,很明顯原生類型是不要需要這個功能的,所以只有BeanConverter及其子類型(HibernateBeanConverter))有這個功能。

語法是這樣的:

<convert converter="bean" match="com.example.Fred">
  <param name="exclude" value="property1, property2"/>
</convert>
這就保證了DWR不會調用 fred.getProperty1() 和fred.getProperty2兩個方法。另外如果你喜歡"白名單"而不是"黑名單"的話:

<convert converter="bean" match="com.example.Fred">
  <param name="include" value="property1, property2"/>
</convert>
安全上比較好的設計是使用"白名單"而不是"黑名單"。

對象的私有成員
通過'object'轉換器的參數的一個名為force的參數,可以讓DWR通過反射來訪問對象私有成員。

語法是這樣的:

<convert converter="object" match="com.example.Fred">
  <param name="force" value="true"/>
</convert>
直到DWR1.1.3,這里有一個bug,public的field反而不能被發現,所以你需要在public成員上設置force=true。