首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MOXy集/地图映射

MOXy集/地图映射
EN

Stack Overflow用户
提问于 2012-08-08 17:40:31
回答 1查看 146关注 0票数 1

我试图使用MOXy为前端客户端生成特定格式的响应,使它们更容易确定特定的关系。这是一个精心设计的示例,但我正在尝试执行如下的…

代码语言:javascript
复制
public class Person {
    private Integer id;

    private String name;

    private Address address;
}

public class Address {
    private String street;

    private String locality;

    private String state;

    private String zip;
}

public class PersonCollectionResponse {
    private Set<Person> people;

    public Set<Person> getPeople() {
        return this.people;
    }

    private int getCount() {
        return this.people.size();
    }
}

…并且希望得到一个像…这样的结果

代码语言:javascript
复制
{
    "meta": {
        "count": 2
    },

    "people": [{
        "id": 1,
        "name": "Danny Parker",
        "contact": {
            "locality": "Zoo York",
            "state": "New York"
        },
    }, {
        "id": 2,
        "name": "Oscar the Grouch",
        "contact": {
            "locality": "San Francisco",
            "state": "California"
        }

    }],

    "mappings": [{
        "person": 1,
        "zip": 10014
    }, {
        "person": 2,
        "zip": 94102
    }]
}

现在,“人员”集并不是很难设置,但是在编写EclipseLink OXM元数据时,我一直在研究如何使映射工作。我正在寻找一种方法来重新定义人们是如何被列出的,这样我就可以得到我的地图。

代码语言:javascript
复制
<xml-element java-attribute="people">
    <xml-element java-attribute="id" xml-path="@id" />
    <xml-element java-attribute="zip" xml-path="@zip" />
</xml-element>

不,我明白了,现在这可能是可能的。因此,我在getMappings上创建了一个PersonCollectionResponse,它返回从人员中生成的List>。这并不理想,但还有更糟的事情。但是,当它被写出来时,映射对象是字符串,类似于so…。

代码语言:javascript
复制
"mappings": ["{person: 1, zip: 10014}", "{person: 2, zip: 94102}"]

所以我想我的问题是…中的一个

  1. 如何使用不同的输出第二次显示元素?
  2. 如何输出映射,而不将它们作为字符串引用?

最糟糕的情况是,我把我的一组泛型映射变成一个新的类对象,并为它们提供一个模式,但这是我想要避免的事情。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-13 15:12:40

目前,MOXy不允许您将单个实例的表示拆分为JSON (或XML)树中的多个位置。请输入您希望看到的支持类型的增强请求:

下面我将演示如何映射JSON消息的部分。

部分答案#1

下面我将描述如何将模型映射到以下JSON消息:

代码语言:javascript
复制
{
   "meta" : {
      "count" : 2
   },
   "people" : [ {
      "id" : 1,
      "name" : "Danny Parker",
      "contact" : {
         "locality" : "Zoo York",
         "state" : "New York"
      }
   }, {
      "id" : 2,
      "name" : "Oscar the Grouch",
      "contact" : {
         "locality" : "San Francisco",
         "state" : "California"
      }
   } ]
}

oxm.xml

代码语言:javascript
复制
<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum11870107">
    <java-types>
        <java-type name="PersonCollectionResponse">
            <java-attributes>
                <xml-element java-attribute="count" xml-path="meta/count/text()"/>
            </java-attributes>
        </java-type>
        <java-type name="Person">
            <xml-type prop-order="id name address"/>
            <java-attributes>
                <xml-element java-attribute="address" name="contact"/>
            </java-attributes>
        </java-type>
        <java-type name="Address">
            <java-attributes>
                <xml-transient java-attribute="zip"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

部分答案#2

现在,我将描述如何将模型映射到以下JSON消息:

代码语言:javascript
复制
{
   "meta" : {
      "count" : 2
   },
   "mappings" : [ {
      "person" : 2,
      "zip" : "94102"
   }, {
      "person" : 1,
      "zip" : "10014"
   } ]
}

oxm.xml

代码语言:javascript
复制
<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum11870107">
    <java-types>
        <java-type name="PersonCollectionResponse">
            <java-attributes>
                <xml-element java-attribute="count" xml-path="meta/count/text()"/>
                <xml-element java-attribute="people" name="mappings"/>
            </java-attributes>
        </java-type>
        <java-type name="Person">
            <xml-type prop-order="id address"/>
            <java-attributes>
                <xml-element java-attribute="id" name="person"/>
                <xml-transient java-attribute="name"/>
                <xml-element java-attribute="address" xml-path="."/>
            </java-attributes>
        </java-type>
        <java-type name="Address" xml-accessor-type="NONE">
            <java-attributes>
                <xml-element java-attribute="zip"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

演示代码

这两个部分解决方案都可以使用相同的演示代码:

代码语言:javascript
复制
package forum11870107;

import java.util.*;
import javax.xml.bind.*;

import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum11870107/oxm.xml");
        properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
        properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {PersonCollectionResponse.class}, properties);

        PersonCollectionResponse pcr = new PersonCollectionResponse();

        Person person1 = new Person();
        person1.setId(1);
        person1.setName("Danny Parker");
        pcr.getPeople().add(person1);
        Address address1 = new Address();
        address1.setLocality("Zoo York");
        address1.setState("New York");
        address1.setZip("10014");
        person1.setAddress(address1);

        Person person2 = new Person();
        person2.setId(2);
        person2.setName("Oscar the Grouch");
        pcr.getPeople().add(person2);
        Address address2 = new Address();
        address2.setLocality("San Francisco");
        address2.setState("California");
        address2.setZip("94102");
        person2.setAddress(address2);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(pcr, System.out);
    }

}

域模型

以下是用于这两种部分解决方案的域模型:

PersonCollectionResponse

代码语言:javascript
复制
package forum11870107;

import java.util.*;

public class PersonCollectionResponse {
    private Set<Person> people = new HashSet<Person>();

    public Set<Person> getPeople() {
        return this.people;
    }

    public void setPeople(Set<Person> people) {
        this.people = people;
    }

    public int getCount() {
        return this.people.size();
    }

}

Person

代码语言:javascript
复制
package forum11870107;

public class Person {
    private Integer id;

    private String name;

    private Address address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}

地址

代码语言:javascript
复制
package forum11870107;

public class Address {

    private String street;
    private String locality;
    private String state;
    private String zip;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getLocality() {
        return locality;
    }

    public void setLocality(String locality) {
        this.locality = locality;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getZip() {
        return zip;
    }

    public void setZip(String zip) {
        this.zip = zip;
    }

}

jaxb.properties

要将MOXy指定为JAXB提供程序,需要在与域模型相同的包中包含一个名为jaxb.properties的文件,其中包含以下条目(参见:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html )。

代码语言:javascript
复制
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11870107

复制
相关文章

相似问题

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