2013-06-17 2 views
2

Я получаю эту ошибку, когда пытаюсь маршалировать объект JAXB в XML. JAXBContext не может найти класс, который я передаю. Я застрял здесь. Любая помощь в этом отношении высоко ценится.Ошибка JAXB при сортировке

Exception in thread "main" java.lang.InternalError 
    at com.sun.xml.internal.bind.v2.model.annotation.RuntimeInlineAnnotationReader.getClassValue(RuntimeInlineAnnotationReader.java:128) 
    at com.sun.xml.internal.bind.v2.model.annotation.RuntimeInlineAnnotationReader.getClassValue(RuntimeInlineAnnotationReader.java:42) 
    at com.sun.xml.internal.bind.v2.model.impl.PropertyInfoImpl.isApplicable(PropertyInfoImpl.java:201) 
    at com.sun.xml.internal.bind.v2.model.impl.PropertyInfoImpl.getApplicableAdapter(PropertyInfoImpl.java:212) 
    at com.sun.xml.internal.bind.v2.model.impl.PropertyInfoImpl.<init>(PropertyInfoImpl.java:111) 
    at com.sun.xml.internal.bind.v2.model.impl.SingleTypePropertyInfoImpl.<init>(SingleTypePropertyInfoImpl.java:60) 
    at com.sun.xml.internal.bind.v2.model.impl.AttributePropertyInfoImpl.<init>(AttributePropertyInfoImpl.java:48) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeAttributePropertyInfoImpl.<init>(RuntimeAttributePropertyInfoImpl.java:43) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeClassInfoImpl.createAttributeProperty(RuntimeClassInfoImpl.java:144) 
    at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.addProperty(ClassInfoImpl.java:851) 
    at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.findFieldProperties(ClassInfoImpl.java:387) 
    at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.getProperties(ClassInfoImpl.java:290) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeClassInfoImpl.getProperties(RuntimeClassInfoImpl.java:165) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:212) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:89) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:178) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:84) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:293) 
    at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.calcRef(TypeRefImpl.java:81) 
    at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.getTarget(TypeRefImpl.java:58) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:47) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:40) 
    at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:63) 
    at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:61) 
    at java.util.AbstractList$Itr.next(AbstractList.java:345) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:224) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:89) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:178) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:84) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:293) 
    at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.calcRef(TypeRefImpl.java:81) 
    at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.getTarget(TypeRefImpl.java:58) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:47) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:40) 
    at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:63) 
    at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:61) 
    at java.util.AbstractList$Itr.next(AbstractList.java:345) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:224) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:89) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:178) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:84) 
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:293) 
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:308) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:430) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1100) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:110) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202) 
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:376) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522) 
    at src.example.MarshalCommlAuto.main(MarshalCommlAuto.java:48) 
+0

В какой среде вы работаете (сервер приложений, Java SE, OSGi и т. Д.)? Как вы создаете свой 'JAXBContext'? –

+0

используя JAVA SE, GlassFish. Вот как я создаю контекст JAXB. У меня также есть индексный файл, помещенный в тот же каталог. Я не знаю, что я делаю неправильно. JAXBContext jaxbContext = JAXBContext.newInstance (CommlAutoPolicyInfoType.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.marshal (commlauto, file); jaxbMarshaller.marshal (commlauto, System.out); – user2487308

ответ

1

При создании JAXBContext из класса Java, то осущий JAXB будет также создавать метаданные для всех классов, если может достигать от него (включая типы недвижимости, супер-классы и классы, указанный в аннотации). Он не будет обрабатывать сканирование или подталкивать подклассы, поэтому необходимо соблюдать осторожность, чтобы обеспечить получение метаданных для всех классов в вашей модели.

Если ваша модель сгенерирована из XML-схемы, тогда вы должны создать JAXBContext из сгенерированного имени пакета. Чтобы обеспечить правильную загрузку классов, вы также должны указать правильное значение ClassLoader. Предполагая, что ваше имя пакета com.example.foo, вы можете сделать следующее.

JAXBContext jc = JAXBContext.newInstance("com.example.foo", CommlAutoPolicyInfoType.class.getClassLoader()); 

Если генерировать модель охватывает несколько пакетов, которые вы разделить пакеты в пути контекста, используя : характер.

JAXBContext jc = JAXBContext.newInstance("com.example.foo:com.example.bar", CommlAutoPolicyInfoType.class.getClassLoader()); 

Для получения более подробной информации

+0

Я пробовал это. Однако это работает. Я продолжаю получать ту же ошибку. Одна вещь, которую я пробовал, - это дать другое имя класса, а не то, что мне нужно, и это сработало. Все объекты JAXB были созданы из XML-схемы, поэтому мое предположение заключается в том, что можно получить один класс, почему не кто-либо из одного и того же пакета. Есть ли у вас какие-либо идеи по этому поводу? – user2487308

+0

@ user2487308 - Указание имени пакета должно было работать в вашем случае использования (вам нужно указать «ClassLoader» на сервере приложений или OSGi. Я обновил свой ответ, чтобы предоставить дополнительную информацию. –

+1

Большое спасибо за ответ ! – user2487308

0

У меня была аналогичная проблема, и это была проблема с некоторыми переходными зависимостей на одном из крупного проекта в компании (но я не получил исключение ClassNotFound, но это InternalError, которое указывает на никуда). Даже когда я использовал подсказку, предложенную @Blaise, она не начала работать.

Итак - как я решаю проблему? Во-первых - я добавил -verbose:class в командную строку, чтобы отслеживать загруженные классы. С этим я понял, что некоторые из классов из моего пакета jaxb (это может быть тот пример пакета: "com.example.foo") по какой-то причине не были загружены. Поэтому я добавил пример импорт для тех ненагруженных классов из JAXB пакета и простого использования на коде, как:

ExampleNotLoadedClass.class.getName(); 

С выше кодой, наконец, во время загрузки этого класса я получил ClassNotFound исключения с классом из другой упаковка. Он должен быть включен в некоторые транзитивные зависимости для этого артефакта, но по какой-то причине это не сработало (я думаю, это не имеет значения, я бы сказал только, что мы разделили наш большой проект и извлекли некоторые артефакты в разные подпроекты) ,

Таким образом, я добавил, что отсутствие зависимости от класса напрямую связано с этим проблемным артефактом, и все началось нормально.

Я надеюсь, что это поможет кому-то в подобной проблеме.

Смежные вопросы