首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XmlRootElement编组导致无法将类型"java.lang.String“作为元素进行编组,因为它缺少@XmlRootElement注释

XmlRootElement编组导致无法将类型"java.lang.String“作为元素进行编组,因为它缺少@XmlRootElement注释
EN

Stack Overflow用户
提问于 2017-02-02 16:59:56
回答 1查看 622关注 0票数 1

我正在尝试在org.apache.cxf.jaxrs.provider.json.JSONProvider.上编写一个测试我只需要显示给定类的JSON表示。我知道还有其他的JSONProviders,比如Jackson,但是对于这个测试,它需要来自cxf的那个。

如果我运行以下测试

代码语言:javascript
运行
复制
package be.axi.jackson;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.core.MediaType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

import org.apache.cxf.jaxrs.impl.MetadataMap;
import org.apache.cxf.jaxrs.provider.json.JSONProvider;
import org.junit.Assert;
import org.junit.Test;



public class JacksonTest {

    @XmlRootElement(name = "Simple", namespace = "be.axi.test")
    static class Simple {

    @XmlElement(name = "values")
    @XmlElementWrapper(name = "data")
    protected List<String> _list;

    public List<String> getList() {
        return _list;
    }

    public void setList(List<String> l) {
        _list = l;
    }
    }

    @Test
    public void testCxf() throws IOException {
    JSONProvider<Object> jsonProvider = new JSONProvider<Object>();
    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    List<String> l = new ArrayList<String>();
    l.add("foo");
    l.add("bar");
    Simple s = new Simple();
    s.setList(l);

    jsonProvider.writeTo(l, Simple.class, Simple.class.getAnnotations(), MediaType.APPLICATION_JSON_TYPE, null, bos);
    String expected = "{\"data\":{\"values\":[\"foo\"]}}";
    Assert.assertEquals(expected, bos.toString());
    }



}

我得到了

代码语言:javascript
运行
复制
feb 02, 2017 9:47:19 AM org.apache.cxf.jaxrs.provider.AbstractJAXBProvider handleJAXBException
WARNING: javax.xml.bind.MarshalException
 - with linked exception:
[com.sun.istack.SAXException2: unable to marshal type "java.lang.String" as an element because it is missing an @XmlRootElement annotation]

我该如何解决这个问题呢?我真的只需要从org.apache.cxf.jaxrs实现中获得Simple.class的JSON表示。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-02 18:08:20

您正在向jsonProvider.writeTo(l,提供List<String> l实例,而不是Simple。更改为s

代码语言:javascript
运行
复制
jsonProvider.writeTo(s, Simple.class, Simple.class.getAnnotations(), MediaType.APPLICATION_JSON_TYPE, null, bos);

要获得预期的输出,请添加

代码语言:javascript
运行
复制
jsonProvider.setDropRootElement(true);

并将属性的@XmlElement@XmlElementWrapper更改为getter。这就是代码

代码语言:javascript
运行
复制
package be.axi.jackson;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.core.MediaType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;


import org.apache.cxf.jaxrs.provider.json.JSONProvider;
import org.junit.Assert;
import org.junit.Test;



public class JettisonTest {

    @XmlRootElement(name = "Simple", namespace = "be.axi.test")
    static class Simple {
        protected List<String> _list;

        @XmlElement(name = "values")
        @XmlElementWrapper(name = "data")
        public List<String> getList() {
            return _list;
        }
        public void setList(List<String> l) {
            _list = l;
        }
    }


    @Test
    public void testCxf() throws IOException {
        JSONProvider<Object> jsonProvider = new JSONProvider<Object>();
        jsonProvider.setDropRootElement(true);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        List<String> l = new ArrayList<String>();
        l.add("foo");
        l.add("bar");
        Simple s = new Simple();
        s.setList(l);

        jsonProvider.writeTo(s, Simple.class, Simple.class.getAnnotations(), MediaType.APPLICATION_JSON_TYPE, null, bos);
        String res = bos.toString();
        String expected = "{\"data\":{\"values\":[\"foo\",\"bar\"]}}";
        Assert.assertEquals(expected, res);
    }
}

请注意,您使用的是CXF的默认JSON实现,即Jettison,而不是jackson

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

https://stackoverflow.com/questions/41997938

复制
相关文章

相似问题

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