为了账号安全,请及时绑定邮箱和手机立即绑定

使用JAXB解组/编组List <String>

使用JAXB解组/编组List <String>

拉莫斯之舞 2019-11-27 10:14:55
我正在尝试创建一个非常简单的REST服务器。我只是有一个测试方法,它将返回字符串列表。这是代码:@GET@Path("/test2")public List test2(){    List list=new Vector();    list.add("a");    list.add("b");    return list;}它给出以下错误:严重:Java类型的消息正文编写器,类java.util.Vector和MIME媒体类型,找不到应用程序/八位位组流我希望JAXB对诸如String,Integer等简单类型具有默认设置。我想不是。这是我的想象:<Strings>  <String>a</String>  <String>b</String></Strings>使这种方法最简单的方法是什么?
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

我使用@LiorH的示例并将其扩展为:



@XmlRootElement(name="List")

public class JaxbList<T>{

    protected List<T> list;


    public JaxbList(){}


    public JaxbList(List<T> list){

        this.list=list;

    }


    @XmlElement(name="Item")

    public List<T> getList(){

        return list;

    }

}


注意,它使用泛型,因此您可以将其与String之外的其他类一起使用。现在,应用程序代码很简单:



    @GET

    @Path("/test2")

    public JaxbList test2(){

        List list=new Vector();

        list.add("a");

        list.add("b");

        return new JaxbList(list);

    }


为什么JAXB包中不存在这个简单的类?有人在其他地方看到类似的东西吗?


查看完整回答
反对 回复 2019-11-27
?
Qyouu

TA贡献1786条经验 获得超11个赞

@GET

@Path("/test2")

public Response test2(){

   List<String> list=new Vector<String>();

   list.add("a");

   list.add("b");


   final GenericEntity<List<String>> entity = new GenericEntity<List<String>>(list) { };

   return Respon


查看完整回答
反对 回复 2019-11-27
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

如果任何人都想为包含多个类的元素的列表编写列表包装器,并且想要根据类类型给出单独的XmlElement名称而无需编写X Wrapper类,则可以使用@XmlMixed注释。这样,JAXB将根据设置的值来命名列表中的项目@XmlRootElement。这样做时,您必须使用以下命令指定可能在列表中的类@XmlSeeAlso


例:


列表中可能的类


@XmlRootElement(name="user")

public class User {/*...*/}


@XmlRootElement(name="entry")

public class LogEntry {/*...*/}

包装类


@XmlRootElement(name="records")

@XmlSeeAlso({User.class, LogEntry.class})

public static class JaxbList<T>{


    protected List<T> records;


    public JaxbList(){}


    public JaxbList(List<T> list){

        this.records=list;

    }


    @XmlMixed 

    public List<T> getRecords(){

        return records;

    }

}

例:


List l = new List();

l.add(new User("userA"));

l.add(new LogEntry(new UserB()));



XStream xStream = new XStream();

String result = xStream.toXML(l);

结果:


<records>

    <user>...</user>

    <entry>...</entry>

</records>

另外,您可以使用@XmlElementRef注解在包装类中直接指定XmlElement名称。


@XmlRootElement(name="records")

@XmlSeeAlso({User.class, LogEntry.class})

public static class JaxbList<T>{


    protected List<T> records;


    public JaxbList(){}


    public JaxbList(List<T> list){

        this.records=list;

    }


    @XmlElementRefs({

        @XmlElementRef(name="item", type=Object.class),

        @XmlElementRef(name="user", type=User.class),

        @XmlElementRef(name="entry", type=LogEntry.class)

    })

    public List<T> getRecords(){

        return records;

    }

}


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 518 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信