Search code examples
ice

NoValueFactoryException when using Zeroc Ice - Sliced vs. compact format?


I am trying to use an Ice client in an OSGi context. Running the server and a minimal example client in a non-OSGi environment works fine. With the client in an OSGi environment I get the following exception:

com.zeroc.Ice.NoValueFactoryException
    reason = "no value factory found and compact format prevents slicing (the sender should use the sliced format instead)"
    type = "::MyModule::Knowledge::CMKnowledge"

However, I am not 100% sure, if the OSGi runtime makes a difference here. The Slice file looks like this:

module MyModule{
    module Knowledge{
        class KnowledgePart{
            string value;
        }

        class FMKnowledge extends KnowledgePart{}
        class CMKnowledge extends KnowledgePart{}

        interface IKnowledge{
            void sendKnowledge(KnowledgePart knowledge);
            FMKnowledge getFMKnowledge();
            CMKnowledge getCMKnowledge();
        }
    }
}

What does this exception mean in this context and how can I fix it? I already tried to set ["format:sliced"] instead of the implicitly used compact format.


Solution

  • The error mean that Ice run-time try to load MyModule.Knowledge.CMKnowledge class but it failed to do so. You must ensure that the class loader used by the application can load MyModule.Knowledge.CMKnowledgeclass.

    See also https://doc.zeroc.com/ice/3.7/language-mappings/java-mapping/custom-class-loaders