2011-08-25 13 views
7

Loro sembra essere un problema quando tento di eseguire il marshaller JAXB in un modulo netbeans. Inizialmente ho pensato che fosse l'implimentation nodo in modo Ho trascorso un paio di giorni riorganizzare tutto però ero ancora recieveing ​​il messaggio di errore stranoJAXB in NetBeans Module

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) 

io non sono esattamente sicuro che cosa il problema è l'importatore/esportatore sembra funzionare in i progetti normali e l'importatore sembrano funzionare correttamente durante l'analisi del file, tuttavia l'esportazione sembra causare problemi. Il metodo che uso per l'esportazione è

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); 
     } 
    } 

qualsiasi tipo di assistenza è apprezzato

+0

Ho trovato che sembra essere un problema con 2 diversi caricatori di classe utilizzati in fase di esecuzione, ma non riesco a trovare la correzione corretta. Credo che possa essere aiutato con un altro costruttore, ma non riesco a capire che cosa dovrebbe essere incluso come il primo parametro contestoPath e impostarlo su stringa vuota o vuota sembra causare e problema 'JAXBContext jc = JAXBContext.newInstance (" ", JAXBImporterExporter.class.getClassLoader());' – kdgwill

+0

Inserisci le risposte come risposte, non metterle nella tua domanda. C'è un pulsante "Rispondi alla tua domanda" in basso. Non c'è nemmeno bisogno di urlare "RISPOSTA" nel titolo o qualcosa del genere. Contrassegna la risposta accettata ogni volta che il tempo è maturo. Guarda, questo è un sito di domande e risposte, non un forum di discussione o qualcosa di primitivo come questo :) – BalusC

+0

okay l'ho capito presto la scorsa notte e dato che nessuno ha risposto o commentato ho capito che sarebbe stato corretto pubblicare una delle soluzioni dal qualcuno ha votato la domanda – kdgwill

risposta

2

ho scoperto che se si cambia invece l'inizializzazione del JAXBContext a JAXBContext.newInstane (String contextPath, ClassLoader loader), in cui la classe loader ricevi dalla classe corrente il tuo in ie MyClass.class.getClassLoader(). Inoltre, invece di uno schema, puoi usare un jaxb.index che è solo un elenco di file di testo dei nomi di classe che hai convertito per l'uso con jaxb che si trova nella loro stessa directory. Loro dovrebbero essere uno per ogni directory, anche se per me sono tutti nella stessa directory. e separato nella stessa stringa nel contesto percorso param del costruttore con:

HERE

3

Una soluzione semplice è quella di aggiungere il modulo dipendere il org.netbeans.modules.xml.jaxb.api modulo che fa parte di NetBeans. Ciò eviterà lo scontro tra due classi JAXB di versioni (una da JDK e la seconda da quel modulo che è preferibile in runtime).

+0

Questa dovrebbe essere la soluzione preferita, IMHO. Sembra un modo più NetBeans per risolvere il problema e ti evita di giocherellare con i classloader. – peterh

+1

Sto affrontando lo stesso problema. Tuttavia, l'aggiunta di org.netbeans.modules.xml.jaxb come dipendenza porta a un altro errore "Il modulo ha una dipendenza di amici su org.netbeans.modules.xml.jaxb ma non è elencato come amico". Secondo https://netbeans.org/bugzilla/show_bug.cgi?id=140336 solo diversi altri moduli possono dipendere da questo. –

+0

Questa soluzione ha funzionato per me. Grazie! – Spindizzy