Сильная научная типизация в XML и в Java - PullRequest
3 голосов
/ 05 января 2011

Мой проект содержит большую схему XSD, а экземпляры схемы привязаны к Java-код с использованием JAXB. Я хотел бы добавить строгие типы в код Java с помощью JScience и связать их с типами XSD.

Моя текущая проблема в том, что JAXB плохо обрабатывает дженерики ... Они вообще не анализируются.

Например, я хочу тип питания в XSD. Я хочу, чтобы JAXB связал его с типом измерения JScience :

<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>



Метод разбора:

public class UnitAdapter{

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

Это прекрасно компилируется с JXC. Мои геттеры и сеттеры имеют хороший тип Measure .

Но когда я пытаюсь прочитать экземпляр схемы с

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


Я получаю:

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...


Ты знаешь, как я могу это сделать? Уже проделана работа по связыванию XSD с типами JScience через JAXB?

Большое спасибо, Корантен

Ответы [ 2 ]

1 голос
/ 05 января 2011

Ваш тип должен быть org.jscience.physics.measures.Measure, так как универсальная информация не используется для создания экземпляра класса (Class.forName(String) не использует универсальную информацию для создания экземпляров объектов).

0 голосов
/ 21 февраля 2015

Я сделал следующий класс в качестве адаптера для измерения, и он работал.

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

}
...