2013-08-12 54 views
1

美好的一天每個人。我正在使用Vaadin,並在BeanItemContainer中遇到了問題。我有一個通用的接口,並實現該接口Introspector getBeanInfo bean通用實現方法

package ru.package.testpackage; 

public class SomeTest { 
    interface SomeHavingId<T> { 
     T getId(); 
     void setId(T id); 
    } 

    class TestBean implements SomeHavingId<Integer> { 
     public TestBean(Integer id) { 
      this.id = id; 
     } 
     @Override 
     public Integer getId() { 
      return id; 
     } 
     @Override 
     public void setId(Integer id) { 
      this.id = id; 
     } 

     private Integer id; 
    } 
} 

的問題是,Vaadin內BeanItemContainer使用Introspector.getBeanInfo(TestBean.class)解析getter和setter方法來創建屬性映射的bean。但不是解決Integer getId()我得到java.lang.Object getId()。就我所見,Introspector無法理解以SomeHavingId<Integer>方式實現的接口。

所以這是我的問題 - 我應該怎麼做才能正確的方法簽名,如果:

  1. 我不能改變這個bean的源代碼
  2. 我不能改變Vaadin
  3. 的源代碼
+0

您使用哪個Java版本?因爲您可以更改BeanInspector的源代碼。我建議使用JRE7。有兩對get/set,一個用於Integer,另一個用於Object,由通用接口引起(你從來不會在Java中看到第二個字符,但是在字節碼和反射中)。使用JRE7時,應該通過更好地決定哪個get/set對使用來解決問題。 –

+0

由於目標平臺限制,我正在使用JRE1.5。我希望我能跳上JRE7。 – fsmorygo

回答

1

不幸的是,這個問題仍然可以發生在JRE7中,但是不可重現。如果結果是正確的,它依賴於方法「Method [] java.lang.Class.getMethods()」返回的方法的順序。

該方法的javadoc說「...返回的數組中的元素沒有排序並且沒有任何特定的順序...」,但introspector使用順序來創建屬性描述符。因此可能會返回一個錯誤的屬性描述符。

我遇到了這個問題,但找不到解決方案,甚至沒有一種方法來重現,因爲它不經常發生。