Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JAXB,如何将具有属性定义类型的XMLelement解组到基于该属性的对象?_Java_Xml_Jaxb_Unmarshalling - Fatal编程技术网

Java 使用JAXB,如何将具有属性定义类型的XMLelement解组到基于该属性的对象?

Java 使用JAXB,如何将具有属性定义类型的XMLelement解组到基于该属性的对象?,java,xml,jaxb,unmarshalling,Java,Xml,Jaxb,Unmarshalling,我的应用程序正在接收编组为XML的对象负载,例如: <targetedMessage> <sender>external application</sender> <payload class="class.path.from.external.application.Foo"> <id>1</id> </payload> </targetedMessage> 枚举可用

我的应用程序正在接收编组为XML的对象负载,例如:

<targetedMessage>
   <sender>external application</sender>
   <payload class="class.path.from.external.application.Foo">
      <id>1</id>
   </payload>
</targetedMessage>
枚举可用于根据外部类路径查找对象的本地类:

public enum ForeignClass {

FOO("class.path.from.external.application.Foo", Foo.class),
BAR("class.path.from.external.application.Bar", Bar.class);

public static getClassFromForeignClassPath(String foreignClassPath) {
  // return class
}
我还有一个
TargetedMessage
类来捕获有关消息本身的元信息:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class TargetedMessage {
    private String sender;
    private Baz baz;
}
正确解组XML需要什么注释?我尝试在
TargetedMessage
类中的
Baz
字段上使用XmlAdapter,但ValueType参数始终为null


@xmldattribute
似乎也不起作用,因为
属性的值与其对应的本地类名不同。

您至少有两个选项。首先,可以将“class”属性映射到字符串枚举,并在TargetedMessage的#getBaz()方法中实现实例化逻辑。XSD如下所示(根据需要重命名类型):


其次,您可以转换初始XML,以便根据其“class”属性内容重命名“payload”元素。例如,它可以是“payloadFoo”、“payloadBar”等。然后,您可以将其直接映射到所需的类。相应的XSD如下所示

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/XMLSchema" xmlns:tns="http://www.example.org/XMLSchema" elementFormDefault="qualified">

    <simpleType name="simpleTypeFoo">
        <restriction base="string">
            <enumeration value="class.path.from.external.application.Foo"></enumeration>
        </restriction>
    </simpleType>

    <simpleType name="simpleTypeBar">
        <restriction base="string">
            <enumeration value="class.path.from.external.application.Bar"></enumeration>
        </restriction>
    </simpleType>

    <complexType name="payloadTypeFoo">
        <sequence>
            <element name="id" type="string"></element>
        </sequence>
        <attribute name="class" type="tns:simpleTypeFoo"></attribute>
    </complexType>

    <complexType name="payloadTypeBar">
        <sequence>
            <element name="id" type="string"></element>
        </sequence>
        <attribute name="class" type="tns:simpleTypeBar"></attribute>
    </complexType>

    <complexType name="payloadType">
        <choice>
            <element name="payloadFoo" type="tns:payloadTypeFoo" minOccurs="0" maxOccurs="1"></element>
            <element name="payloadBar" type="tns:payloadTypeBar" minOccurs="0" maxOccurs="1"></element>
        </choice>
    </complexType>

    <complexType name="targetedMessageType">
        <sequence>
            <element name="sender" type="string"></element>
            <element name="payload" type="tns:payloadType"></element>
        </sequence>
    </complexType>
</schema>

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/XMLSchema" xmlns:tns="http://www.example.org/XMLSchema" elementFormDefault="qualified">

    <include schemaLocation=""></include>

    <simpleType name="simpleTypeClass">
        <restriction base="string">
            <enumeration value="class.path.from.external.application.Foo"></enumeration>
            <enumeration value="class.path.from.external.application.Bar"></enumeration>
        </restriction>
    </simpleType>

    <complexType name="payloadType">
        <sequence>
            <element name="id" type="string"></element>
        </sequence>
        <attribute name="class" type="tns:simpleTypeClass"></attribute>
    </complexType>

    <complexType name="targetedMessageType">
        <sequence>
            <element name="sender" type="string"></element>
            <element name="payload" type="tns:payloadType"></element>
        </sequence>
    </complexType>
</schema>
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/XMLSchema" xmlns:tns="http://www.example.org/XMLSchema" elementFormDefault="qualified">

    <simpleType name="simpleTypeFoo">
        <restriction base="string">
            <enumeration value="class.path.from.external.application.Foo"></enumeration>
        </restriction>
    </simpleType>

    <simpleType name="simpleTypeBar">
        <restriction base="string">
            <enumeration value="class.path.from.external.application.Bar"></enumeration>
        </restriction>
    </simpleType>

    <complexType name="payloadTypeFoo">
        <sequence>
            <element name="id" type="string"></element>
        </sequence>
        <attribute name="class" type="tns:simpleTypeFoo"></attribute>
    </complexType>

    <complexType name="payloadTypeBar">
        <sequence>
            <element name="id" type="string"></element>
        </sequence>
        <attribute name="class" type="tns:simpleTypeBar"></attribute>
    </complexType>

    <complexType name="payloadType">
        <choice>
            <element name="payloadFoo" type="tns:payloadTypeFoo" minOccurs="0" maxOccurs="1"></element>
            <element name="payloadBar" type="tns:payloadTypeBar" minOccurs="0" maxOccurs="1"></element>
        </choice>
    </complexType>

    <complexType name="targetedMessageType">
        <sequence>
            <element name="sender" type="string"></element>
            <element name="payload" type="tns:payloadType"></element>
        </sequence>
    </complexType>
</schema>