Как я могу представить полиморфизм в JMX? - PullRequest
4 голосов
/ 18 октября 2010

У меня есть несколько типов, подобных этому:

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 - нет, так как в классе должен присутствовать хотя бы один метод получения, чтобы он распознал его как пригодный для использования тип.Я знаю, что любая попытка добавить слой абстракции не поможет, потому что сам NumberingComponent уже является таким слоем.В оригинальной версии интерфейсов были также и дженерики, но я удалил их, чтобы сделать их проще, и они не работают точно так же с ними или без них.это для составного типа?Я погуглил сообщение об исключении и по сути не получил ни одного хита.(!!)

1 Ответ

1 голос
/ 05 апреля 2011

Вы можете сделать так, чтобы интерфейсы StringNumberingComponent и IntegerNumbering также расширялись CompositeDataView .Предполагая, что MBeanInfo MBean указывает правильный CompositeType для атрибута, MBeanServer будет «отображать» атрибут как экземпляр CompositeData, который будет правильно сериализован.

Метод, который потребуется реализовать конкретным реализациям, довольно прост, поскольку ваш CompositeType будет иметь только одно поле:

public CompositeData toCompositeData(CompositeType ct) 

В JavaDoc есть достойный пример.

...