Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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
Xml Jaxb2Marshaller cvc elt.1:即使类元素已知,也找不到元素的声明_Xml_Spring Boot_Jaxb_Spring Ws - Fatal编程技术网

Xml Jaxb2Marshaller cvc elt.1:即使类元素已知,也找不到元素的声明

Xml Jaxb2Marshaller cvc elt.1:即使类元素已知,也找不到元素的声明,xml,spring-boot,jaxb,spring-ws,Xml,Spring Boot,Jaxb,Spring Ws,我编写了两个XSD来生成模型,并在调用web服务时验证实体 我用来生成模型的Maven插件是:org.codehaus.mojo:jaxb2 Maven插件:2.3,它成功地从以下XSD生成了正确的模型: 请求。xsd: <?xml version="1.0"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/200

我编写了两个XSD来生成模型,并在调用web服务时验证实体

我用来生成模型的Maven插件是:
org.codehaus.mojo:jaxb2 Maven插件:2.3
,它成功地从以下XSD生成了正确的模型:

请求。xsd:

<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="SLIR" type="SLIRType"/>
    <!-- region ENUMS -->
    <xs:simpleType name="PriorityTypeType" final="restriction">
        <xs:restriction base="xs:token">
            <xs:enumeration value="NORMAL"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="LocationTypeType" final="restriction">
        <xs:restriction base="xs:token">
            <xs:enumeration value="LAST"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="WGSType" final="restriction">
        <xs:restriction base="xs:token">
            <xs:enumeration value="WGS-84"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="CoordSystemType" final="restriction">
        <xs:restriction base="xs:token">
            <xs:enumeration value="LL"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="MSIDEncType" final="restriction">
        <xs:restriction base="xs:token">
            <xs:enumeration value="ASC"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="MSIDTypeType" final="restriction">
        <xs:restriction base="xs:token">
            <xs:enumeration value="MSISDN"/>
        </xs:restriction>
    </xs:simpleType>
    <!-- endregion -->

    <xs:complexType name="SLIRType">
        <xs:all>
            <xs:element type="ClientType" name="CLIENT"/>
            <xs:element type="MSIDListType" name="MSIDS"/>
            <xs:element type="GeoInfoType" name="GEO_INFO"/>
            <xs:element type="LocationType" name="LOC_TYPE"/>
            <xs:element type="PriorityType" name="PRIO"/>
            <xs:element type="EQoPType" name="EQoP" minOccurs="0"/>
        </xs:all>
        <xs:attribute type="xs:string" name="ver" default="1.0"/>
    </xs:complexType>

    <xs:complexType name="ClientType">
        <xs:sequence>
            <xs:element type="xs:string" name="ID"/>
            <xs:element type="xs:string" name="PWD"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="MSIDType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute type="MSIDEncType" name="msid_enc" use="required"/>
                <xs:attribute type="MSIDTypeType" name="msid_type" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="MSIDListType">
        <xs:sequence>
            <xs:element type="MSIDType" name="MSID" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="GeoInfoType">
        <xs:attribute type="WGSType" name="datum" use="required"/>
        <xs:attribute type="CoordSystemType" name="coord_sys" use="required"/>
    </xs:complexType>

    <xs:complexType name="LocationType">
        <xs:attribute type="LocationTypeType" name="loc_type_type" use="required"/>
    </xs:complexType>

    <xs:complexType name="PriorityType">
        <xs:attribute type="PriorityTypeType" name="prio_type" use="required"/>
    </xs:complexType>
    <xs:complexType name="EQoPType">
        <!-- unknown -->
    </xs:complexType>


</xs:schema>
<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="SLIA" type="SLIAType"/>
    <xs:complexType name="LL_POINTType">
        <xs:sequence>
            <xs:element type="xs:double" name="LAT"/>
            <xs:element type="xs:double" name="LONG"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="POINTType">
        <xs:sequence>
            <xs:element type="LL_POINTType" name="LL_POINT"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="CIRCLEType">
        <xs:sequence>
            <xs:element type="POINTType" name="POINT"/>
            <xs:element type="xs:integer" name="RAD"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="SHAPEType">
        <xs:sequence>
            <xs:element type="CIRCLEType" name="CIRCLE"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="PDType">
        <xs:sequence>
            <xs:element type="xs:integer" name="TIME"/>
            <xs:element type="SHAPEType" name="SHAPE"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="POSERRResultType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute type="xs:string" name="resid"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="POSERRType">
        <xs:sequence>
            <xs:element type="POSERRResultType" name="RESULT" />
            <xs:element type="xs:string" name="TIME" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="POSType">
        <xs:sequence>
            <xs:element type="xs:string" name="MSID"/>
            <xs:choice minOccurs="0">
                <xs:element type="PDType" name="PD"/>
                <xs:element type="POSERRType" name="POSERR"/>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="RESULTType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute type="xs:string" name="resid"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="SLIAType">
        <xs:sequence>
            <xs:element type="POSType" name="POS" minOccurs="0"/>
            <xs:element type="xs:string" name="GMT_OFF"/>
            <xs:element type="RESULTType" name="RESULT"/>
            <xs:element type="xs:string" name="ADD_INFO" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute type="xs:string" name="ver"/>
    </xs:complexType>
</xs:schema>
然后像这样使用它:

@Bean
public Jaxb2Marshaller marshaller(
        @Value("classpath:/schemas/gmlc-requests.xsd") Resource reqSchema,
        @Value("classpath:/schemas/gmlc-responses-new.xsd") Resource resSchema
) {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan("xml.gmlc.v1.request.**", "xml.gmlc.v1.response.**");
    marshaller.setSchemas(reqSchema, resSchema);
    return marshaller;
}
Object sliaElement = marshaller.unmarshal(new StringSource(xmlResponse));
在使用响应XSD进行验证的同时,是否有方法使
Jaxb2Marshaller
解组此响应消息?它应该保留在默认名称空间中


使用外部验证器网站提供上面提到的响应XSD和正文,结果是有效的,因此我不认为XSD是错误的,并且查看Jaxb2Marshaller的源代码,这个错误来自模式验证,因此那里发生了一些奇怪的事情。

为什么元素被分割为两个XSD?我认为问题在于setSchemas方法。Jaxb将尝试根据第一个匹配模式(基于名称空间)进行验证;这将是requestSchema

尝试只提供一个模式并解组相应的xml消息或
将模式合并到一个文件中。

将两个XSD合并到一个文件中是可行的!然而,为了保持我的包结构,我将两个XSD分开保存,并生成第三个XSD,其中包括另外两个,然后将其用作验证模式。
Object sliaElement = marshaller.unmarshal(new StringSource(xmlResponse));