3

我的项目包含一个大的 XSD 架构,并且架构实例使用 JAXB 绑定到 java 代码。我想使用 JScience 将强类型添加到 java 代码中,并将它们绑定到 XSD 类型。

我目前的问题是 JAXB 处理非常糟糕的泛型......它们根本没有被解析。

例如,我想要 XSD 中的电源类型。我希望 JAXB 将其绑定到 JScience 类型 Measure<Power>:

<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 编译得很好。我的 getter 和 setter 有很好的类型 Measure<Power>。

但是当我试图用

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


你知道我该怎么做吗?是否已经通过 JAXB 将 XSD 绑定到 JScience 的类型?

非常感谢, Corentin

4

2 回答 2

1

您的类型应该是org.jscience.physics.measures.Measure泛型信息不用于实例化类(Class.forName(String)不要使用泛型信息来实例化对象)。

于 2011-01-05T10:52:04.347 回答
0

我将以下类作为 Measure 的适配器,并且它有效。

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

}
于 2015-02-21T08:18:02.157 回答