gpt4 book ai didi

java - 根据 xsd 验证 java.util.Map

转载 作者:行者123 更新时间:2023-12-01 05:11:47 25 4
gpt4 key购买 nike

我有一个生成 jaxb 类的 xsd。为此,我为通用 map 创建了一个 XML 适配器。该适配器通过单元测试,并且生成的变量的类型适本地是预期的映射。但问题是,当尝试验证从此场景创建的对象时,我得到“无法将‘hashMap’类型解析为元素‘autoExecuteArguments’的定义。我已经摆弄了很多,但总是以上述内容的一些变体结束错误。这两个绑定(bind)没有一起使用,但举例说明了达成某种解决方案的尝试。

      <xjc:javaType name="java.util.Map" xmlType="mp:MapTypeEntry"
adapter="mil.dod.th.ose.core.impl.mp.UtilMapConverter" />

<jaxb:bindings schemaLocation="resources/missionProgramSchema/MissionProgram.xsd">
<jaxb:bindings node="//xs:element[@name='MissionProgramInstance']">
<jaxb:bindings node="//xs:element[@name='autoExecuteArguments']">
<jaxb:property>
<jaxb:baseType name="java.util.HashMap">
<xjc:javaType name="java.util.Map"
adapter="//core.impl.mp.UtilMapConverter" />
</jaxb:baseType>
</jaxb:property>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>

我确信最后一个是对绑定(bind)的 mock ,因此我无法使其在大量调整下工作,我得到“[错误]编译器无法支持此属性自定义。它附加到错误的位置,或者与其他绑定(bind)不一致。

接下来是转换器:

@XmlSeeAlso(UtilMapConverter.MapType.class)
public class UtilMapConverter<K, V> extends XmlAdapter<UtilMapConverter.MapType<K,V>, Map<K, V>> {

@Override
public UtilMapConverter.MapType<K, V> marshal(final Map<K, V> map)
{
final MapType<K, V> mapType = new MapType<K, V>();
for (Map.Entry<K, V> entry : map.entrySet())
{
final MapTypeEntry<K, V> mapEntryType = new MapTypeEntry<K, V>();
mapEntryType.setKey(entry.getKey());
mapEntryType.setValue(entry.getValue());
mapType.getEntry().add(mapEntryType);
}
return mapType;
}

@Override
public Map<K, V> unmarshal(final UtilMapConverter.MapType<K, V> genericMap)
{
final Map<K, V> map = new HashMap<K, V>();

for (MapTypeEntry<K, V> mapEntryType : genericMap.getEntry())
{
map.put(mapEntryType.getKey(), mapEntryType.getValue());
}
return map;
}

@XmlAccessorType(XmlAccessType.PROPERTY)
public static class MapType<K, V>
{
private List<MapTypeEntry<K, V>> m_Entry = new ArrayList<MapTypeEntry<K, V>>();

public MapType()
{
}

public MapType(final Map<K, V> map)
{
for (Map.Entry<K, V> e : map.entrySet())
{
m_Entry.add(new MapTypeEntry<K, V>(e));
}
}
@XmlElement
@XmlSchemaType(name = "mapType")
public List<MapTypeEntry<K, V>> getEntry()
{
return m_Entry;
}
public void setEntry(final List<MapTypeEntry<K, V>> entry)
{
this.m_Entry = entry;
}
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public static class MapTypeEntry<K, V>
{

@XmlElement(required = true)
@XmlSchemaType(name = "key")
protected K m_Key;


@XmlElement(required = true)
@XmlSchemaType(name = "value")
protected V m_Value;


public MapTypeEntry()
{
}


public MapTypeEntry(final Map.Entry<K, V> entry)
{
m_Key = entry.getKey();
m_Value = entry.getValue();
}


@XmlElement
public K getKey()
{
return m_Key;
}

@XmlElement
public V getValue()
{
return m_Value;
}
}

我知道我的情况一团糟。我只是在疯狂地试图弄清楚什么是有帮助的,什么是有害的,什么是愚蠢的。最后是 xsd:

    <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://core/mp/model" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" targetNamespace="http://core/mp/model"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" elementFormDefault="qualified"
id="MissionProgramInstance" jaxb:version="2.1"
jaxb:extensionBindingPrefixes="xjc">
<xs:include schemaLocation="MissionProgram.xsd" />
<xs:element name="MissionProgramInstance">
<xs:complexType>
<xs:sequence>
<xs:element name="program" type="MissionProgram"
minOccurs="1" />
<xs:element name="autoExecuteArguments" minOccurs="0">
<xs:annotation>
<xs:appinfo>
<jaxb:property>
<jaxb:baseType name="java.util.Map" />
</jaxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute name="autoExecuteEnabled" type="xs:boolean"
use="required" />
<xs:attribute name="assetDep" use="optional">
<xs:simpleType>
<xs:list itemType="xs:string" />
</xs:simpleType>
</xs:attribute>
<xs:attribute name="physicalLinkDep" use="optional">
<xs:simpleType>
<xs:list itemType="xs:string" />
</xs:simpleType>
</xs:attribute>
<xs:attribute name="linkLayerDep" use="optional">
<xs:simpleType>
<xs:list itemType="xs:string" />
</xs:simpleType>
</xs:attribute>
<xs:attribute name="transportLayerDep" use="optional">
<xs:simpleType>
<xs:list itemType="xs:string" />
</xs:simpleType>
</xs:attribute>
<xs:attribute name="imageStreamDep" use="optional">
<xs:simpleType>
<xs:list itemType="xs:string" />
</xs:simpleType>
</xs:attribute>
<xs:attribute name="programDep" use="optional">
<xs:simpleType>
<xs:list itemType="xs:string" />
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:complexType name="MissionProgram">
<xs:sequence>
<!--This field holds source data for a mission program -->
<xs:element name="source" type="xs:string" minOccurs="1" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType name="MapType">
<xs:sequence>
<xs:element name="autoExecuteArgument" type="MapTypeEntry">
<xs:annotation>
<xs:appinfo>
<jaxb:property>
<jaxb:baseType name="//core.mp.impl.UtilMapConverter.MapType" />
</jaxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="MapTypeEntry">
<xs:list itemType="xs:anySimpleType" />
</xs:simpleType>
</xs:schema>

当前演示中有一些冗余。我是 xsd 和 jaxb 的新手。我试图理解这一切,但尽管尝试进行研究,我认为我找错了地方,因为我似乎找到了一些碎片,但没有找到所有这些共同作用的解释。这是我尝试将至少部分内容放在一起的主要资源之一:http://blog.bdoughan.com/2010/07/xmladapter-jaxbs-secret-weapon.html 。还有 xml 适配器的 javadocs,以及到处浏览的内容。谢谢您至少花时间思考“您会做什么?”

最佳答案

我会做的(并且已经完成的)是编写一个干净的 xsd 并使用 xjc 生成 java 类。如果您需要更“编码器友好”的数据结构,请编写自己的代码来转换反序列化后的 jaxb 对象。试图强制 xml 符合您所希望的数据结构外观通常是一种令人沮丧的练习,并且随着您的项目随着时间的推移而发生变化,这会让您的生活变得困难。

关于java - 根据 xsd 验证 java.util.Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11925639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com