2010-10-18 62 views
4

我有一些類型是這樣的:如何在JMX中表示多態性?

public interface Numbering { 
    List<NumberingComponent> getComponents(); 
} 

public interface NumberingComponent { 
    Object getValue(); 
} 

public interface StringNumberingComponent extends NumberingComponent { 
    String getValue(); 
} 

public interface IntegerNumberingComponent extends NumberingComponent { 
    Integer getValue(); 
} 

這是一切都很好,除非你嘗試註冊一個MXBean這恰好使用這種類型的,你會得到:

 
...top of exception chain omitted ... 
Caused by: javax.management.openmbean.OpenDataException: Cannot convert type: class com.acme.NumberingComponent 
    at com.sun.jmx.mbeanserver.OpenConverter.openDataException(OpenConverter.java:1411) 
    at com.sun.jmx.mbeanserver.OpenConverter.toConverter(OpenConverter.java:264) 
    at com.sun.jmx.mbeanserver.OpenConverter.makeArrayOrCollectionConverter(OpenConverter.java:315) 
    at com.sun.jmx.mbeanserver.OpenConverter.makeParameterizedConverter(OpenConverter.java:393) 
    at com.sun.jmx.mbeanserver.OpenConverter.makeConverter(OpenConverter.java:296) 
    at com.sun.jmx.mbeanserver.OpenConverter.toConverter(OpenConverter.java:262) 
    ... 57 more 
Caused by: javax.management.openmbean.OpenDataException: Cannot convert type: interface java.io.Serializable 
    at com.sun.jmx.mbeanserver.OpenConverter.openDataException(OpenConverter.java:1411) 
    at com.sun.jmx.mbeanserver.OpenConverter.toConverter(OpenConverter.java:264) 
    at com.sun.jmx.mbeanserver.OpenConverter.makeCompositeConverter(OpenConverter.java:467) 
    at com.sun.jmx.mbeanserver.OpenConverter.makeConverter(OpenConverter.java:293) 
    at com.sun.jmx.mbeanserver.OpenConverter.toConverter(OpenConverter.java:262) 
    ... 61 more 
Caused by: javax.management.openmbean.OpenDataException: Can't map java.io.Serializable to an open data type 
    at com.sun.jmx.mbeanserver.OpenConverter.makeCompositeConverter(OpenConverter.java:454) 
    at com.sun.jmx.mbeanserver.OpenConverter.makeConverter(OpenConverter.java:293) 
    at com.sun.jmx.mbeanserver.OpenConverter.toConverter(OpenConverter.java:262) 
    ... 64 more 

字符串和整數在JMX中可表示,但Object不是,因爲至少有一個getter需要出現在類中才能將其識別爲可用類型。我知道任何添加抽象層的嘗試都不會有幫助,因爲NumberingComponent本身已經是這樣一個層。原始版本的界面中也有泛型,但爲了保持簡單,我刪除了它們,並且失敗方式與使用或不使用它們相同。

有沒有其他一些方法可以將其映射到複合類型?我搜索了異常消息,並且根本沒有點擊。 (!!)

+0

你可以顯示你正在註冊的實際班級嗎? JMX將使用對類的反射,而不是接口,對嗎?你確定你的界面層次真的是這裏的問題嗎? – Gray 2010-10-18 13:45:19

+0

看來,它實際上反映在接口上。我知道它使用實際的類聲明,因爲它發現List 並意識到它需要檢查如何轉換Thing(這不會在運行時出現)。 – Trejkaz 2010-10-19 22:27:15

回答

1

您可以使StringNumberingComponent和IntegerNumbering接口也延伸CompositeDataView。假設MBean的MBeanInfo指示屬性的正確CompositeType,則MBeanServer將把該屬性「呈現」爲CompositeData實例,該實例將正確序列化。

具體實現需要實現的方法是相當簡單的,因爲你的CompositeType只會有一個字段:

public CompositeData toCompositeData(CompositeType ct) 

有一個在JavaDoc一個體面的例子。