有没有办法让Jersey使用EclipseLink Moxy在JAXB元素集合周围自动生成多个元素名称?

时间:2013-09-20 20:36:42

标签: list collections jaxb jersey moxy

我使用Jersey 2.1 API返回JAXB注释对象的列表。

我有一个班级人员

@XmlRootElement(name = "person")
public class Person {  ...

在Jersey API中,当我返回一个Person列表并将输出设置为xml时,它会创建一个名为< People>的包装器。在我的名单上:

<People>
   <Person>
      .. fields
   </Person>
</People>

当我将输出设置为JSON格式时,它不会添加这个额外的People包装器,我希望它。我使用EclipseLink Moxy作为JSON提供程序。有没有办法让JSON输出看起来与XML相同?

我遇到了一个名为FEATURE_XMLROOTELEMENT_PROCESSING的Jersey 1.X API的字段,它应该启用此功能,但我不知道如何在2.x中设置它。事实上它正在为XML输出做这件事似乎表明它已经设置好了。我只需要让JSON变得相同!

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

Java模型

您可以在对象模型中引入一个名为People的新类。

<强>人

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

@XmlRootElement(name="People")
@XmlAccessorType(XmlAccessType.FIELD)
public class People {

    @XmlElementRef
    private List<Person> person;

}

<强>人

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Person")
public class Person {

}

RESTful服务

而不是:

@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Person> read() {

你会这样做:

@GET
@Produces(MediaType.APPLICATION_JSON)
public People read() {

默认情况下,MOXy不包含根元素。使用Jersey时,您可以利用MoxyJsonConfig对象(请参阅:http://blog.bdoughan.com/2013/06/moxy-is-new-default-json-binding.html)。

import javax.ws.rs.ext.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.glassfish.jersey.moxy.json.MoxyJsonConfig;

@Provider
public class MOXyJsonContextResolver implements ContextResolver<MoxyJsonConfig> {

    private final MoxyJsonConfig config;

    public MOXyJsonContextResolver() {
        config = new MoxyJsonConfig()
            .setIncludeRoot(true);
    }

    @Override
    public MoxyJsonConfig getContext(Class<?> objectType) {
        return config;
    }

}

您还可以利用MOXy的MOXyJsonProvider类进行相同的配置: