我有类似这样的类型:
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搜索了异常消息,基本上没有点击。 (!!)
答案 0 :(得分:1)
您可以使StringNumberingComponent和IntegerNumbering接口也扩展CompositeDataView。假设MBean的MBeanInfo指示属性的正确CompositeType,MBeanServer将“呈现”该属性作为将正确序列化的CompositeData实例。
具体实现需要实现的方法相当简单,因为您的CompositeType只有一个字段:
public CompositeData toCompositeData(CompositeType ct)
JavaDoc中有一个不错的例子。