Xml Jaxb2Marshaller cvc elt.1:即使类元素已知,也找不到元素的声明
我编写了两个XSD来生成模型,并在调用web服务时验证实体 我用来生成模型的Maven插件是: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
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));