如何在JMX中表示多态?

时间:2010-10-18 05:55:52

标签: java polymorphism 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本身已经是这样一个层。接口的原始版本也有泛型,但我删除它们以使其更简单,并且无论是否有它们都会以相同的方式失败。

还有其他方法可以将其映射到复合类型吗?我用Google搜索了异常消息,基本上没有点击。 (!!)

1 个答案:

答案 0 :(得分:1)

您可以使StringNumberingComponent和IntegerNumbering接口也扩展CompositeDataView。假设MBean的MBeanInfo指示属性的正确CompositeType,MBeanServer将“呈现”该属性作为将正确序列化的CompositeData实例。

具体实现需要实现的方法相当简单,因为您的CompositeType只有一个字段:

public CompositeData toCompositeData(CompositeType ct) 

JavaDoc中有一个不错的例子。