2011-08-25 30 views
7

Su parece ser un problema cuando intento ejecutar JAXB marshaller en un módulo de NetBeans. Originalmente pensé que era el implimentation nodo, así que pasé un par de días la reorganización de todo sin embargo todavía estaba recieveing ​​el mensaje de error extrañoJAXB en NetBeans Módulo

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) 

No estoy exactamente seguro de lo que el problema es el importador/exportador parece funcionar en proyectos normales y el importador parece funcionar bien al analizar el archivo, sin embargo, la exportación parece causar problemas. El método que utilizo para la exportación es

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

cualquier ayuda se aprecia

+0

he encontrado que parece ser un problema con 2 cargadores de clases diferentes que se utilizan en tiempo de ejecución sin embargo, me parece que no puede encontrar la solución adecuada. Yo creo que se puede ayudar con otro constructor sin embargo, me parece que no puede averiguar lo que debe incluirse como primer parámetro de contextPath y se establece como null o cadena vacía parece ser la causa y el problema 'JAXBContext jc = JAXBContext.newInstance (" ", JAXBImporterExporter.class.getClassLoader());' – kdgwill

+0

Por favor, publique las respuestas como respuestas, no lo incluya en su pregunta. Hay un botón "Responda su pregunta" en la parte inferior. Tampoco es necesario gritar "RESPONDIENDO" en el título o algo así. Simplemente marque la respuesta aceptada cada vez que llegue el momento. Mira, este es un sitio de preguntas y respuestas, no es un foro de discusión o algo primitivo como ese :) – BalusC

+0

bien lo descubrí temprano anoche y como nadie respondió o comentó en absoluto pensé que estaría bien publicar una de las soluciones desde alguien votó por la pregunta – kdgwill

Respuesta

2

he encontrado que si en lugar de cambiar la inicialización de la JAXBContext a JAXBContext.newInstane (String contextPath, ClassLoader loader) en la que el cargador de clases usted recibe de la clase actual su en, es decir, MyClass.class.getClassLoader(). También, en lugar de un esquema, puede usar un jaxb.index que es solo una lista de archivos de texto de los nombres de clase que ha aumentado para usar con jaxb que está dentro de su mismo directorio. Debería ser uno para cada directorio, aunque para mí todos estaban en el mismo directorio. y separó de la misma cadena en el contexto ruta parámetro del constructor:

HERE

3

Una solución fácil es añadir la dependencia módulo sobre org.netbeans.modules.xml.jaxb.api módulo que forma parte de NetBeans. Esto evitará el choque entre dos versiones de las clases de JAXB (una de JDK y la segunda de ese módulo que se prefiere en tiempo de ejecución).

+0

Esta debería ser la solución preferida, en mi humilde opinión. Parece una forma más de NetBeans de resolver el problema y te evita manipular a los cargadores de clases. – peterh

+1

Estoy enfrentando el mismo problema. Sin embargo, agregar org.netbeans.modules.xml.jaxb como una dependencia conduce a otro error "El módulo tiene una dependencia de amigo en org.netbeans.modules.xml.jaxb, pero no aparece como amigo". Según https://netbeans.org/bugzilla/show_bug.cgi?id=140336, solo se permite que otros muchos módulos dependan de él. –

+0

Esta solución funcionó para mí. ¡Gracias! – Spindizzy