首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >映射的JAXB映射

映射的JAXB映射
EN

Stack Overflow用户
提问于 2012-07-04 20:45:13
回答 2查看 5.4K关注 0票数 3

使用JAXB,如何映射下面的<entry key="childResources">

我尝试将它映射到Map、@XmlRootElement anotated类列表和其他方法,但都没有成功。

代码语言:javascript
运行
复制
<?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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-10 21:44:37

java.util.Map接口没有用于编组/解组其实例的提供程序。您必须编写一个扩展XmlAdapter的类,并用@XmlJavaTypeAdapter(MyMapAdapter.class)注释java.util.Map属性。

在谷歌上搜索jax-rs java.util.map一段时间后,我得到了下面的代码。在我的例子中,我将适配器命名为XmlStringMapAdapter而不是MyMapAdapter。

ServiceDefinition.java

代码语言:javascript
运行
复制
@XmlRootElement(name = "entry")
@XmlAccessorType(XmlAccessType.FIELD)
public class ServiceDefinition {

    @XmlAttribute
    private String key;

    @XmlJavaTypeAdapter(XmlStringMapAdapter.class)
    private Map<String, String> map = new HashMap<String, String>();

    // getters & setters
}

EntryElement.java

代码语言:javascript
运行
复制
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;
    }
}

MapElement.java

代码语言:javascript
运行
复制
@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));
    }

}

XmlStringMapAdapter.java

代码语言:javascript
运行
复制
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;
    }

}

bellow是我用来测试新的map适配器的一个类。

ServiceResouce.java

代码语言:javascript
运行
复制
@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();
    }
}

上述资源的输出如下所示。

代码语言:javascript
运行
复制
<?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>
票数 8
EN

Stack Overflow用户

发布于 2012-07-09 22:35:44

查看文档的XSD:

代码语言:javascript
运行
复制
<?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从该模式生成具有映射的模型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11329388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档