加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何在JMX中表示多态?

发布时间:2020-12-15 02:22:04 所属栏目:Java 来源:网络整理
导读:我有这样的类型: public interface Numbering { ListNumberingComponent getComponents();}public interface NumberingComponent { Object getValue();}public interface StringNumberingComponent extends NumberingComponent { String getValue();}public
我有这样的类型:

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有一个很好的例子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读