Караф, ServiceMix странный пример поведения - PullRequest
3 голосов
/ 11 апреля 2019

Исходный код JAXB RI содержит:

public void setProperty(String name, Object value) throws PropertyException {

    if( PREFIX_MAPPER.equals(name) ) {
        if(!(value instanceof NamespacePrefixMapper))
            throw new PropertyException(
                Messages.MUST_BE_X.format(
                        name,
                        NamespacePrefixMapper.class.getName(),
                        value.getClass().getName() ) );
        prefixMapper = (NamespacePrefixMapper)value;
        return;
    }

Я вызываю его так:

        Class c = Class.forName("org.docx4j.jaxb.ri.NamespacePrefixMapper");
        prefixMapper = c.newInstance();         
        m.setProperty("com.sun.xml.bind.namespacePrefixMapper", prefixMapper );

, где мой класс c объявлен следующим образом:

public class NamespacePrefixMapper extends com.sun.xml.bind.marshaller.NamespacePrefixMapper 
    implements NamespacePrefixMapperInterface, McIgnorableNamespaceDeclarator 

Обычно это работает нормально (в том числе в Karaf 4.2.4, ServiceMix 7.0.1), но у меня возникают проблемы с ServiceMix 5.4.1.

В ServiceMix 5.4.1 я получаю:

javax.xml.bind.PropertyException: property "com.sun.xml.bind.namespacePrefixMapper" must be an instance of type com.sun.xml.bind.marshaller.NamespacePrefixMapper, not org.docx4j.jaxb.ri.NamespacePrefixMapper
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:502)

, что загадочно, так как он расширяет com.sun.xml.bind.marshaller.NamespacePrefixMapper

Ожидается ли, что instanceof будет вести себя по-другому в среде OSGi?

МыслиДобро пожаловать, спасибо!

...