Jersey 2 JSON Jettison展开根元素

时间:2016-03-08 14:43:09

标签: json rest jaxb jax-rs jersey-2.0

我们正从泽西岛1队转移到泽西岛队2号队。 到目前为止,我们使用的ContextResolver配置如下:

import com.sun.jersey.api.json.JSONConfiguration;
import com.sun.jersey.api.json.JSONConfiguration.MappedBuilder;

        @Provider
        @Produces("application/json")
public class JSONJAXBContextResolver implements ContextResolver<Class<?>> {
            @Override
                public JAXBContext getContext(Class<?> objectType) {

                        MappedBuilder mapped = JSONConfiguration.mapped();
                        mapped.arrays("Property"); //$NON-NLS-1$
                        mapped.arrays("option"); //$NON-NLS-1$
                        JSONConfiguration build = mapped.xml2JsonNs(NamespacesMapper.getNamespacesMap()).build();
                        return new JSONJAXBContext(build, objectType);

                }
    }

一切都很好,生成的json看起来像这样(根xml元素被解包,即删除): {“@ id”:“as213”,“code”:“ERR12”,“cause”:{“validationMessages”:{“validationMessage”:{“message”:“some message”,“details”:“some details” “严重性”: “ERROR”}}}}

然而,对于泽西2,没有更多的JSONConfiguration.mapped()。 相反,我们正在考虑放弃做同样事情的方式。 所以我们现在有:

@Provider
@Produces("application/json")
public class JSONJAXBContextResolver implements ContextResolver<Class<?>> {

@Override
    public JAXBContext getContext(Class<?> objectType) {

             MappedJettisonBuilder mappedJettison = JettisonConfig.mappedJettison();

             mappedJettison.serializeAsArray("Property"); //$NON-NLS-1$
             mappedJettison.serializeAsArray("option"); //$NON-NLS-1$
             JettisonConfig build = mappedJettison.xml2JsonNs(NamespacesMapper.getNamespacesMap()).build();
            return new JettisonJaxbContext(build, objectType);


    }

然而,这会产生以下结果: {“error”:{“@ id”:“as213”,“code”:“ERR12”,“cause”:{“validationMessages”:{“validationMessage”:{“message”:“some message”,“details” :“一些细节”,“严重性”:“错误”}}}}}

注意“root”元素“error”。这打破了我们的JSON表示时间。

我花了将近2天时间试图弄清楚如何配置Jettison以排除xml根元素,但无济于事。

我在JettisonConfig javadoc中注意到以下内容: https://jersey.java.net/apidocs/2.1/jersey/org/glassfish/jersey/jettison/JettisonConfig.html#DEFAULT

public static final JettisonConfig DEFAULT

    The default JettisonConfig uses JettisonConfig.Notation.MAPPED_JETTISON notation with root unwrapping option set to true. 

然而,即使使用DEFAULT配置而不是Mapped也不会生成所需的json - 根“error”元素仍然存在。

我甚至在Jettison源代码中查找控制此行为的配置属性,但找不到任何内容。

有没有人知道怎样以及是否有可能让Jettison忽略根XML元素?

0 个答案:

没有答案