2011-01-05 7 views
3

Mein Projekt enthält ein großes XSD-Schema, und Schemainstanzen werden an den Java-Code mit JAXB gebunden. Ich möchte mithilfe von JScience starke Typen in den Java-Code einfügen und sie an XSD-Typen binden.Starke wissenschaftliche Typisierung in XML und in Java

Mein aktuelles Problem ist, dass JAXB sehr schlecht Generika behandeln ... Sie sind überhaupt nicht geparst.

Zum Beispiel möchte ich einen Leistungstyp in der XSD. Ich möchte JAXB den JScience Typ Measure <Strom> binden:

<xs:simpleType name="PowerType"> 
    <xs:annotation> 
     <xs:appinfo> 
      <jxb:javaType name="org.jscience.physics.measures.Measure&lt;javax.measure.quantities.Power&gt;" 
          parseMethod="org.f4g.adapter.UnitAdapter.unmarshalPower" /> 
     </xs:appinfo> 
    </xs:annotation> 
<xs:restriction base="xs:double"/>   
</xs:simpleType> 



Die Parse-Methode ist:

public class UnitAdapter{ 

public static Measure<Power> unmarshalPower(String value) { 
     return Measure.valueOf(Double.valueOf(value), SI.WATT); 
    } 
} 

Dies kompiliert fein mit JXC. Meine Getter und Setter haben den schönen Typ Measure <Power>.

Aber wenn ich versuche, mit

// create an Unmarshaller 
Unmarshaller u = JAXBContext.newInstance("org.f4g.schema.test").createUnmarshaller(); 


ein Schema Instanz zu lesen bekomme ich:

Exception in thread "main" java.lang.reflect.MalformedParameterizedTypeException 
at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:60) 
at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:53) 
at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:95) 
at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:104) 
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140) 
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) 
at sun.reflect.generics.repository.FieldRepository.getGenericType(FieldRepository.java:85) 
etc... 


Wissen Sie, wie kann ich tun? Gibt es bereits Arbeit, XSD an JSciences Typen über JAXB zu binden?

Vielen Dank, Corentin

Antwort

1

sollte Ihre Art org.jscience.physics.measures.Measure sein als Generika Informationen nicht instanziieren Klasse verwendet wird (Class.forName(String) keine Generika Informationen instanziieren Objekte verwenden).

+0

Ja, das stimmt und es funktioniert, wenn ich nur org.jscience.physics.measures.Measure als Bindungstyp festlegen. Aber ich verliere völlig die Information über die Dimension in der XSD. Ich verliere es auch im Code, da meine Getter/Setter nur einen "Measure" -Typ haben und nicht einen "Measure " -Typ. – cdupont

+0

Ich hätte gerne eine ausdrucksstarke XSD, die sowohl die Dimension (zB Power) als auch die Einheit (zB Watt) beinhaltet. Ein bisschen wie in UnitsML http://unitsml.nist.gov/ – cdupont

+0

Ich fürchte, dass diese Ebene der Information in diesem Fall nicht verfügbar ist. Wie ich bereits sagte, liegt das an den Einschränkungen im Verhalten von Class.forName. – Riduidel

0

Ich habe die folgende Klasse als Adapter für Measure gemacht und es hat funktioniert.

public class MeasureAdapter extends XmlAdapter<String, Measure<Double, Quantity>> { 

public String marshal(Measure<Double, Quantity> value) throws Exception { 
    if (null == value) { 
     return null; 
    } 

    return value.toString(); 
} 

@SuppressWarnings("unchecked") 
@Override 
public Measure<Double, Quantity> unmarshal(String str) throws Exception { 
    if(str == null || str.length() == 0) { 
     return null; 
    } 

    String[] d = str.split(" "); 
    Measure<Double, Quantity> m = null; 
    m = (Measure<Double, Quantity>) Measure.valueOf(Double.parseDouble(d[0]), Unit.valueOf(d[1])); 

    return m; 
} 

}