2011-01-24 19 views
9

Sto usando MOXy come implementazione JAXB ma in qualche modo mi piacerebbe mostrare il nome di implementazione (ad esempio Moxy) e il numero di versione su qualche schermata di amministrazione (dinamicamente).Come sapere quale implementazione JAXB viene utilizzata?

Come posso recuperare le informazioni da JAXB?

Acclamazioni

risposta

10

Si potrebbe fare qualcosa di simile a quanto segue per capire i impl JAXB utilizzata:

import javax.xml.bind.JAXBContext; 

public class Demo { 

    private static final String MOXY_JAXB_CONTEXT = "org.eclipse.persistence.jaxb.JAXBContext"; 
    private static final String METRO_JAXB_CONTEXT = "com.sun.xml.bind.v2.runtime.JAXBContextImpl"; 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 

     String jaxbContextImpl = jc.getClass().getName(); 
     if(MOXY_JAXB_CONTEXT.equals(jaxbContextImpl)) { 
      System.out.println("EclipseLink MOXy"); 
     } else if(METRO_JAXB_CONTEXT.equals(jaxbContextImpl)) { 
      System.out.println("Metro"); 
     } else { 
      System.out.println("Other"); 
     } 
    } 

} 

È possibile ottenere informazioni sulla versione EclipseLink in uso dalla sua classe Versione:

import org.eclipse.persistence.Version; 

public class VersionDemo { 

    public static void main(String[] args) { 
     System.out.println(Version.getVersion()); 
    } 
} 
+0

Grazie mille! Funziona tutto bene. – basZero

+0

E come indagare su cosa è "Altro"? – Line

0

Sulla base della risposta di Blaise Doughan, una leggera modifica (test JUnit). Si noti che il pacchetto dell'implementazione Metro sembra essere cambiato (forse intorno a Java6u4). Non c'è ancora un'interfaccia di autoispezione? TRISTE!

import org.junit.Test; 

public class JaxbVersion { 

    @Test 
    public void printJaxbInformation() throws JAXBException { 
     String MOXY = "org.eclipse.persistence.jaxb"; 
     String METRO_EARLY = "com.sun.xml.bind.v2"; 
     String METRO_LATE = "com.sun.xml.internal.bind.v2"; // since JDK 6u4 (?) 
     String CAMEL = "org.apache.camel.converter.jaxb";  
     Class<?> clazz = SomeJaxbGeneratedClass.class; 
     // http://docs.oracle.com/javaee/7/api/javax/xml/bind/JAXBContext.html 
     JAXBContext jc = JAXBContext.newInstance(clazz); 
     String jcClassName = jc.getClass().getName(); 
     String res; 
     if (jcClassName.startsWith(MOXY)) { 
      res = "EclipseLink MOXy"; 
     } else if (jcClassName.startsWith(METRO_EARLY) || jcClassName.startsWith(METRO_LATE)) { 
      res = "Oracle Metro"; 
     } else if (jcClassName.startsWith(CAMEL)) { 
      res = "Apache Camel"; 
     } else { 
      res = "Unknown"; 
     } 
     res = res + "(" + jcClassName + ")";   
     System.out.println(res); 
    } 

} 
Problemi correlati