java-使用JAXB解组/编组List

我正在尝试创建一个非常简单的REST服务器。 我只是有一个测试方法,它将返回字符串列表。 这是代码:

它给出以下错误:

SEVERE: A message body writer for Java type,

class java.util.Vector, and MIME media type,

application/octet-stream, was not found

我希望JAXB对诸如String,Integer等简单类型具有默认设置。我想不是。 这是我的想象:

a

b

使这种方法最简单的方法是什么?

User1 asked 2020-07-05T10:56:44Z

12个解决方案

46 votes

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

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

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

User1 answered 2020-07-05T10:57:12Z

32 votes

@GET

@Path("/test2")

public Response test2(){

List list=new Vector();

list.add("a");

list.add("b");

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

return Response.ok().entity(entity).build();

}

Sample Code answered 2020-07-05T10:57:28Z

12 votes

如果任何人都想为包含多个类的元素的列表编写列表包装器,并且想要根据类类型给出单独的XmlElement名称而不编写X Wrapper类,则可以使用@XmlElementRef注释。这样,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{

protected List records;

public JaxbList(){}

public JaxbList(List list){

this.records=list;

}

@XmlMixed

public List 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);

结果:

...

...

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

@XmlRootElement(name="records")

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

public static class JaxbList{

protected List records;

public JaxbList(){}

public JaxbList(List 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 getRecords(){

return records;

}

}

Zounadire answered 2020-07-05T10:58:14Z

11 votes

从个人博客文章中,不必创建特定的JaxbList < T >对象。

假设一个对象带有字符串列表:

@XmlRootElement

public class ObjectWithList {

private List list;

@XmlElementWrapper(name="MyList")

@XmlElement

public List getList() {

return list;

}

public void setList(List list) {

this.list = list;

}

}

JAXB往返:

public static void simpleExample() throws JAXBException {

List l = new ArrayList();

l.add("Somewhere");

l.add("This and that");

l.add("Something");

// Object with list

ObjectWithList owl = new ObjectWithList();

owl.setList(l);

JAXBContext jc = JAXBContext.newInstance(ObjectWithList.class);

ObjectWithList retr = marshallUnmarshall(owl, jc);

for (String s : retr.getList()) {

System.out.println(s);

} System.out.println(" ");

}

产生以下内容:

Somewhere

This and that

Something

Jérôme Verstrynge answered 2020-07-05T10:58:48Z

11 votes

使用出色的XStream库,可以更轻松地完成此操作。 没有包装,没有注释。

目标XML

a

b

序列化

(String别名可以通过使用小写2952941757329310710721标签来避免,但我使用的是OP的代码)

List list = new ArrayList ();

list.add("a");

list.add("b");

XStream xStream = new XStream();

xStream.alias("Strings", List.class);

xStream.alias("String", String.class);

String result = xStream.toXML(list);

反序列化

反序列化为ArrayList

XStream xStream = new XStream();

xStream.alias("Strings", ArrayList.class);

xStream.alias("String", String.class);

xStream.addImplicitArray(ArrayList.class, "elementData");

List result = (List )xStream.fromXML(file);

反序列化为String []

XStream xStream = new XStream();

xStream.alias("Strings", String[].class);

xStream.alias("String", String.class);

String[] result = (String[])xStream.fromXML(file);

请注意,XStream实例是线程安全的,并且可以预先配置,从而使代码量减少到一线。

XStream也可以用作JAX-RS服务的默认序列化机制。 可以在此处找到在Xersey中插入XStream的示例

Alex Abdugafarov answered 2020-07-05T10:59:44Z

8 votes

我几次遇到这种模式,我发现最简单的方法是用JaxB批注定义内部类。 (无论如何,您可能需要定义根标签名称)

所以你的代码看起来像这样

@GET

@Path("/test2")

public Object test2(){

MyResourceWrapper wrapper = new MyResourceWrapper();

wrapper .add("a");

wrapper .add("b");

return wrapper ;

}

@XmlRootElement(name="MyResource")

private static class MyResourceWrapper {

@XmlElement(name="Item")

List list=new ArrayList();

MyResourceWrapper (){}

public void add(String s){ list.add(s);}

}

如果您使用javax.rs(jax-rs),我将返回包装为对象的Response对象

LiorH answered 2020-07-05T11:00:13Z

3 votes

最后,我使用context.xml解决了它。您需要在Spring JacksonJaxbJsonProvider和Maven 中进行一些更改

在您的春季context.xml中将JacksonJaxbJsonProvider添加到:

在您的Maven pom.xml中添加:

org.codehaus.jackson

jackson-jaxrs

1.9.0

petrsyn answered 2020-07-05T11:00:42Z

2 votes

User1的示例对我来说效果很好。 但是,作为警告,除非添加@XmlSeeAlso批注,否则它不能用于简单的String / Integer类型。

@XmlRootElement(name = "List")

@XmlSeeAlso(MovieTicket.class)

public class MovieTicketList {

protected List list;

尽管可以阻止我在整个应用程序中使用单个通用列表类,但此方法还可以。 它还可能解释了为什么在JAXB包中不存在这个看似明显的类。

piepera answered 2020-07-05T11:01:07Z

0 votes

确保在JaxbList中使用特定类添加@XmlSeeAlso标记。 非常重要,否则会引发HttpMessageNotWritableException

Maggy answered 2020-07-05T11:01:27Z

0 votes

如果我早点找到Resteasy Jackson Provider,我会节省时间。

只需添加Resteasy Jackson Provider JAR。 没有实体包装。 没有XML注释。 没有自定义消息正文编写器。

mstrthealias answered 2020-07-05T11:01:51Z

0 votes

如果您在jersey项目中使用maven,请在pom.xml中添加以下内容并更新项目依赖项,以便Jaxb能够检测模型类并将列表转换为Media类型应用程序XML:

com.sun.xml.bind

jaxb-core

2.2.11

user7455210 answered 2020-07-05T11:02:12Z

0 votes

对于更通用的解决方案,对于只需要编写一个新类的任何顶级列表的JAXB-XML序列化,请查看此问题中给出的解决方案:

是否可以以编程方式配置JAXB?

public class Wrapper {

private List items = new ArrayList();

@XmlAnyElement(lax=true)

public List getItems() {

return items;

}

}

//JAXBContext is thread safe and so create it in constructor or

//setter or wherever:

...

JAXBContext jc = JAXBContext.newInstance(Wrapper.class, clazz);

...

public String marshal(List things, Class clazz) {

//configure JAXB and marshaller

Marshaller m = jc.createMarshaller();

m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

//Create wrapper based on generic list of objects

Wrapper wrapper = new Wrapper(things);

JAXBElement wrapperJAXBElement = new JAXBElement(new QName(clazz.getSimpleName().toLowerCase()+"s"), Wrapper.class, wrapper);

StringWriter result = new StringWriter();

//marshal!

m.marshal(wrapperJAXBElement, result);

return result.toString();

}

Gonen I answered 2020-07-05T11:02:36Z

java jaxb 集合_java-使用JAXB解组/编组List String相关推荐

  1. java 类集合_java集合类详解

    一.集合类与数组的区别 1.集合的长度可变,数组的长度固定: 2.集合用来存放对象引用,数组用来存放基本类型的数据: 二.集合类的关系 1.Collection接口 存储一组不唯一.无序的对象. 2. ...

  2. java jaxb 集合_java.util.List是一个接口,JAXB不能处理接口

    java.util.List是一个接口,JAXB不能处理接口 尝试部署我的应用程序时,我似乎得到以下exception: Caused by: com.sun.xml.bind.v2.runtime. ...

  3. java链表集合_Java底层基于链表实现集合和映射--集合Set操作详解

    本文实例讲述了Java底层基于链表实现集合和映射--集合Set操作.分享给大家供大家参考,具体如下: 在Java底层基于二叉搜索树实现集合和映射中我们实现了底层基于二叉搜索树的集合,本节就底层如何基于 ...

  4. java hashmap实例_java HashMap详解及实例代码

    java hashmap /* * map集合的特点 * 将键映射值的对象,一个映射不能包含重复的值:每个键最多只能映射到一个值 * * map集合和collection集合的区别? * map集合存 ...

  5. java泛型集合_Java泛型集合(Set)

    Java在Set接口中提供了泛型的支持. 语法 Set set = new HashSet(); 在上面代码中, set - Set接口的对象. T - 在Set声明期间传递的泛型类型参数. 描述 T ...

  6. jibx工具使用和遇到的问题。环境部署、组件bind、解组编组

    开题:jibx内涵解组器unmarshalDocument()和编组器marshalObject(),可以实现java对象和xml的互相转换.依托与binding.xml配置文件.(复杂) 一.mav ...

  7. 泛型java 代码讲解_Java泛型详解

    2516326-5475e88a458a09e4.png 一,打破砂锅问到底 泛型存在的意义? 泛型类,泛型接口,泛型方法如何定义? 如何限定类型变量? 泛型中使用的约束和局限性有哪些? 泛型类型的继 ...

  8. java使用集合存储过程_详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map           本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...

  9. java泛型 初始化_Java泛型详解

    概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有 ...

最新文章

  1. 在Ubuntu 14.04上设置生产环境可用的Node.js
  2. SpringMVC 理论与实用技术(一) 简单、实用、易懂的几个实例
  3. Linux线程(七)
  4. raft引入no-op解决了什么问题
  5. 洛谷p2704 炮兵阵地
  6. 如何做到服务器虚拟化_尽可能地做到无服务器,但不止于此
  7. 数据特征分析-统计分析
  8. 设置SGA的原则以及修改它的大小
  9. CentOS 利用Yum安装mysql后无法启动(MySQL Daemon failed to start.)
  10. Django表单字段汇总
  11. EMeeting会议预约系统软件,会议预约新方案
  12. java环境_Java 开发环境配置
  13. animation的八大属性及HTML基础动画效果——平移、旋转、缩放、倾斜、过渡
  14. 关于8杯酒只有一杯酒有毒,每个人是否中毒只能化验一次,至少需要几个人辨识。...
  15. 靶机渗透练习25-Funbox4-CTF
  16. DSP之Controlsuit和C2000Ware下载安装
  17. 【原创】PHP扩展开发进阶
  18. 痛心!中兴通讯子公司研发工程师跳楼坠亡...
  19. SpringBoot——使用拦截器拦截未登录用户
  20. [ESP32][esp-idf] AP+STA实现无线桥接 中转wifi信号 路由器

热门文章

  1. 使用inspector功能查看和管理契约
  2. (组合数学笔记)Pólya计数理论_Part.9_Pólya定理的推广——De Bruijn定理
  3. 使用爬虫爬去网上的图片并保存
  4. 约瑟夫问题公式及代码实现
  5. windows下JAVA环境变量配置
  6. mongodb数组更新操作符$addToSet
  7. 正在播放 html全集视频教程,正在播放:HTML基础视频教程(全集)-网络编程视频-星火视频教程 21edu8.com...
  8. python加密字符串小写字母循环后错两位_python数据类型_字符串常用操作(详解)
  9. 将某一类型文件还原为无默认打开方式
  10. python的表达式范围怎么写_python表达式