运维开发网

Java 如何在JMX中表示多态?

运维开发网 https://www.qedev.com 2020-03-09 18:15 出处:网络 作者:运维开发网整理
我有这样的类型: public interface Numbering { List<NumberingComponent> getComponents(); } public interface NumberingComponent { Object getValue(); } public interface StringNumberingComponent extends
我有这样的类型:

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搜索了异常消息,基本上没有点击. (!!)

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

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

public CompositeData toCompositeData(CompositeType ct)

在JavaDoc有一个很好的例子.

0

精彩评论

暂无评论...
验证码 换一张
取 消