Java 映射的JAXB映射
使用JAXB,如何映射下面的Java 映射的JAXB映射,java,jaxb,Java,Jaxb,使用JAXB,如何映射下面的 我尝试将它映射到一个映射,映射到@XmlRootElement类列表和其他方式,但没有成功 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <map> <entry key="extraProperties"> <map> <entry key="methods">
我尝试将它映射到一个映射,映射到@XmlRootElement类列表和其他方式,但没有成功
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<map>
<entry key="extraProperties">
<map>
<entry key="methods">
<list>
<map>
<entry key="name" value="GET" />
</map>
<map />
<map>
<entry key="name" value="POST" />
<entry key="messageParameters">
<map>
<entry key="id">
<map>
<entry key="acceptableValues" value="" />
<entry key="optional" value="false" />
<entry key="defaultValue" value="" />
<entry key="type" value="string" />
</map>
</entry>
<entry key="enabled">
<map>
<entry key="acceptableValues" value="" />
<entry key="optional" value="true" />
<entry key="defaultValue" value="true" />
<entry key="type" value="boolean" />
</map>
</entry>
<entry key="factoryclass">
<map>
<entry key="acceptableValues" value="" />
<entry key="optional" value="false" />
<entry key="defaultValue" value="" />
<entry key="type" value="string" />
</map>
</entry>
<entry key="description">
<map>
<entry key="acceptableValues" value="" />
<entry key="optional" value="true" />
<entry key="defaultValue" value="" />
<entry key="type" value="string" />
</map>
</entry>
<entry key="target">
<map>
<entry key="acceptableValues" value="" />
<entry key="optional" value="true" />
<entry key="defaultValue" value="server" />
<entry key="type" value="string" />
</map>
</entry>
<entry key="property">
<map>
<entry key="acceptableValues" value="" />
<entry key="optional" value="true" />
<entry key="defaultValue" value="" />
<entry key="type" value="string" />
</map>
</entry>
<entry key="restype">
<map>
<entry key="acceptableValues" value="" />
<entry key="optional" value="false" />
<entry key="defaultValue" value="" />
<entry key="type" value="string" />
</map>
</entry>
</map>
</entry>
</map>
</list>
</entry>
<entry key="commands">
<list />
</entry>
<entry key="childResources">
<map>
<entry key="ab/cd" value="http://localhost:4848/management/domain/resources/custom-resource/ab%2Fcd" />
<entry key="xx" value="http://localhost:4848/management/domain/resources/xx" />
</map>
</entry>
</map>
</entry>
<entry key="message" value="" />
<entry key="exit_code" value="SUCCESS" />
<entry key="command" value="custom-resource" />
</map>
查看文档的XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="map" type="mapType"/>
<xs:complexType name="entryType" mixed="true">
<xs:sequence>
<xs:element type="mapType" name="map" minOccurs="0"/>
<xs:element type="listType" name="list" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:string" name="key" use="optional"/>
<xs:attribute type="xs:string" name="value" use="optional"/>
</xs:complexType>
<xs:complexType name="listType" mixed="true">
<xs:sequence>
<xs:element type="mapType" name="map" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="mapType" mixed="true">
<xs:sequence>
<xs:element type="entryType" name="entry" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
将其与为类所做的映射进行比较。很高兴看到你的类和注释
您可以使用许多不同的IDE实用程序(如Eclipse和Intellij)或通过CLI使用此模式的映射生成模型。java.util.Map接口没有用于封送/解封其实例的提供程序。您必须编写一个扩展
XmlAdapter
的类,并使用@XmlJavaTypeAdapter(MyMapAdapter.class)
注释java.util.Map
属性
在谷歌上搜索jax-rs-java.util.map
一段时间后,我得到了下面的代码。在本例中,我将适配器命名为XmlStringMapAdapter,而不是MyMapAdapter
ServiceDefinition.java
MapElement.java
上述资源的输出如下所示
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entry key="childResources">
<map>
<entry key="ab/cd" value="http://localhost:8080/management/resources/ab/cd" />
<entry key="xx" value="http://localhost:8080/management/resources/xx" />
</map>
</entry>
一个
可以有一个或一个?我猜一个映射有多个条目,每个条目都有一个键/值pairI guess应该映射到一个映射或一个映射。映射到一个映射时出现了什么错误?为什么不使用XPATH表达式来获取所需的值?使用JAXB可以映射文档结构,但不能使映射依赖于属性的内容,如key=“childResources”
。
public class EntryElement {
@XmlAttribute public String key;
@XmlAttribute public String value;
public EntryElement() {}
public EntryElement(String key, String value) {
this.key = key;
this.value = value;
}
}
@XmlRootElement(name = "map")
public class MapElement {
@XmlElement(name = "entry")
public List<EntryElement> entries = new ArrayList<EntryElement>();
public void addEntry(String key, String value) {
entries.add(new EntryElement(key, value));
}
}
public class XmlStringMapAdapter extends XmlAdapter<MapElement, Map<String, String>> {
@Override
public MapElement marshal(Map<String, String> v) throws Exception {
if (v == null || v.isEmpty()) {return null;}
MapElement map = new MapElement();
for (String key : v.keySet()) {
map.addEntry(key, v.get(key));
}
return map;
}
@Override
public Map<String, String> unmarshal(MapElement v) throws Exception {
if (v == null) {return null;}
Map<String, String> map = new HashMap<String, String>(v.entries.size());
for(EntryElement entry: v.entries) {
map.put(entry.key, entry.value);
}
return map;
}
}
@Path("service")
public class ServiceResource {
@Context
private UriInfo uriInfo;
@GET
@Path("definition")
@Produces("application/xml")
public Response getDefinition() {
ServiceDefinition def = new ServiceDefinition();
UriBuilder b = uriInfo.getBaseUriBuilder();
def.setKey("childResources");
def.getMap().put("ab/cd", b.path("ab/cd").build(this).getPath());
def.getMap().put("xx", b.path("xx").build(this).getPath());
return Response.ok(def).build();
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entry key="childResources">
<map>
<entry key="ab/cd" value="http://localhost:8080/management/resources/ab/cd" />
<entry key="xx" value="http://localhost:8080/management/resources/xx" />
</map>
</entry>