Давайте посмотрим на строку кода, которая выдает исключение:
JAXBContext jaxbContext = JAXBContext.newInstance(name);
В приведенной выше строке кода аргумент name
, который вы передаете, является именем класса, которыйбыть десериализованным и определенным во время выполнения (а именно, serializers.SettingsProvider
в данном образце).Этого может быть недостаточно для JAXB, чтобы определить все классы, составляющие контекст JAXB.Поэтому вместо этого попробуйте передать имя пакета (ов), которые содержат все классы, которые этот дескриптор JAXBContext
должен десериализовать - все классы в этом пакете (ах) - это ваш JAXB-контекст .Это то, что будет известно во время компиляции.Итак, вместо этого попробуйте следующую строку кода:
JAXBContext jaxbContext = JAXBContext.newInstance("serializers");
Здесь «сериализаторы» - это имя пакета, содержащего все классы, которые вы хотите десериализовать, т. Е. контекст JAXBдля данного образца .
Вы можете обратиться к учебнику Oracle JAXB и отметить следующие строки кода:
import primer.po.*;
...
JAXBContext jc = JAXBContext.newInstance( "primer.po" );
Пожалуйста, обратитесь к этому Javadoc и обратите внимание, что в случае десериализации классов, распределенных по нескольким пакетам, тогда список пакетов, разделенных двоеточиямиимена должны быть переданы, например, -
JAXBContext.newInstance( "com.acme.foo:com.acme.bar" )
Если вы должны передать имена классов вместо имен пакетов, то сначала внимательно прочитайте этот Javadoc .Обратите внимание, что экземпляр JAXBContext
будет инициализирован только с классами, переданными в качестве параметра, и классами, которые статически доступны из этих классов.Предпочитайте писать свою программу таким образом, чтобы передаваемые имена классов были известны во время компиляции.
Кроме того, вам может быть полезно заметить, что универсальные в Java разные (особенно в отношении типа стирание)), чем в C # - см. Какова концепция стирания в дженериках в Java? .
Кроме того, учитывая объявление класса:
class XmlSerializableObject<T> {
}
, в котором говорится, что класс XmlSerializableObject
имеет дело с типом T
, следующее объявление класса:
class SettingsProvider extends XmlSerializableObject<SettingsProvider> {
}
в котором говорится, что класс SettingsProvider
имеет дело со своими собственными типами звуков, запутанными.
Или вы вместо этого подразумеваете, что он объявляется следующим образом:
class SettingsProvider extends XmlSerializableObject<Settings> {
}
, в котором говорится, что класс SettingsProvider
сделок с типом Settings
?