JAXB в модуле Netbeans - PullRequest
       21

JAXB в модуле Netbeans

7 голосов
/ 25 августа 2011

Кажется, это проблема, когда я пытаюсь запустить маршаллер JAXB в модуле netbeans.Первоначально я думал, что это была имплементация узла, поэтому я потратил пару дней на реорганизацию всего, но я все еще получал странное сообщение об ошибке

javax.xml.bind.JAXBException: ClassCastException: attempting to cast jar:file:/C:/Program%20Files/jmonkeyplatform/ide/modules/ext/jaxb/api/jaxb-api.jar!/javax/xml/bind/JAXBContext.class to jar:file:/C:/Program%20Files/Java/jdk1.6.0_21/jre/lib/rt.jar!/javax/xml/bind/JAXBContext.class.  Please make sure that you are specifying the proper ClassLoader.    
    at javax.xml.bind.ContextFinder.handleClassCastException(ContextFinder.java:96)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:205)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:363)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
    at com.spectre.util.JAXBImporterExporter.write(JAXBImporterExporter.java:63)

Я не совсем уверен, что проблема заключается в том, что импортер / экспортер кажетсяработают в обычных проектах, и импортер, кажется, работает нормально при синтаксическом анализе файла, однако экспорт вызывает проблемы.Метод, который я использую для экспорта,

 public static <T> void write(T savable, Class<T> type,Object path) {
        try {
            JAXBContext jc = JAXBContext.newInstance(type);
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            if(path instanceof File)
                marshaller.marshal(savable, (File)path);
            else if(path instanceof OutputStream){
                marshaller.marshal(savable, (OutputStream)path);
            }else throw new NoSuchMethodException("The Field Path must be of either type File or OutputStream");
        } catch (NoSuchMethodException ex) {
            Exceptions.printStackTrace(ex);
        } catch (JAXBException ex) {
            Exceptions.printStackTrace(ex);
        }
    }

любая помощь приветствуется

Ответы [ 2 ]

3 голосов
/ 30 мая 2014

Простое решение - добавить зависимость модуля от модуля org.netbeans.modules.xml.jaxb.api, который является частью NetBeans.Это предотвратит конфликт между двумя версиями классов JAXB (один из JDK и второй из этого модуля, который предпочтителен во время выполнения).

2 голосов
/ 28 августа 2011

Я обнаружил, что если вместо этого вы измените инициализацию JAXBContext на JAXBContext.newInstane (String contextPath, ClassLoader loader), в котором загрузчик классов вы получаете из текущего класса, то есть в MyClass.class.getClassLoader ().Кроме того, вместо схемы вы можете использовать jaxb.index, который представляет собой просто список текстовых файлов с именами классов, которые вы добавили для использования с jaxb, который находится в их том же каталоге.Их должно быть по одному на каждый каталог, хотя для меня они все в одном каталоге.и разделяется в той же строке в параметре пути к контексту конструктора с помощью:

ЗДЕСЬ

...