2013-07-11 152 views
1

我們使用JPA實體來獲取數據庫行,然後當我們將其傳遞給外部時,我們想要使用斷開連接的對象(DTO),這是使用JAX-B註釋的簡單bean。爲什麼從JPA實體向JAX-B Bean使用BeanUtils.copyProperties似乎不可能?

我們用一個映射,與它的代碼看起來是這樣的:

public BillDTO map(BillEntity source, BillDTO target) { 

     BeanUtils.copyProperties(source, target); 

     return target; 
    } 

但代碼運行時,我們得到這樣一個錯誤:

java.lang.IllegalArgumentException: argument type mismatch 

注意這是Spring實現的BeanUtils:

import org.springframework.beans.BeanUtils 

和屬性的命名是相同的(與他們的getter/setter)。

任何人都知道錯誤發生的原因以及如何使用快速方法而不是逐個複製屬性?

+1

郵政完整的堆棧跟蹤,並添加BillDTO'或'BillEntity' – Ilya

+0

嗨'代碼,你指出正確的方式,其實我發現爲什麼沒有做的工作:在一個DTO是財產的在實體中,它是一個字符串。即使我在DTO中添加了一個新的setter,但它使用了一個String,它不起作用。 –

回答

2

這個例子運行良好。這裏String屬性被複制到enum財產
實體

public class A 
{ 
    private String valueFrom; 

    public String getValue() 
    { 
     return valueFrom; 
    } 

    public void setValue(String value) 
    { 
     this.valueFrom = value; 
    } 
} 

DTOEn是枚舉)在class B

public class B 
{ 
    private En valueTo; 

    public void setValue(String def) 
    { 
     this.valueTo = En.valueOf(def); 
    } 

    public void setEnumValue(En enumVal) 
    { 
     this.valueTo = enumVal; 
    } 
} 

至於你的GitHub的例子,問題的getter:
應be

public String getValue() // 

例如

public String getValue() 
{ 
    return value.toString(); 
} 
+0

你正在使用哪個BeanUtils? Spring一個還是Apache一個? –

+0

@ruffp Spring .. – Ilya

+0

我有一個測試類似於:https://gist.github.com/ruffp/5976432結果:變量c被正確設置(「C」),但b.getValue()保留爲空。但我沒有任何例外。 –

相關問題