2

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

我有一个班级人

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

在 Jersey API 中,当我返回一个人员列表并将输出设置为 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 相同!

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

4

1 回答 1

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类来做同样的配置:

于 2013-09-21T10:46:53.713 回答