【问题标题】:XML unmarshalling to java objectsXML 解组到 java 对象
【发布时间】:2012-04-21 09:43:26
【问题描述】:

XML 响应

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
- <Film>
  <film_id>1</film_id> 
  <title>ACADEMY DINOSAUR</title> 
  <description>xxx</description> 
  <length>86</length> 
  <image_id>1</image_id> 
-  <image>
   <image_id>1</image_id> 
   <name>1.jpg</name> 
   <size>408307</size> 
   <type>.jpg</type> 
   <content>base64 byte</content>
   </image>
 </Film>

我已经为 Film 和 Image 创建了 pojo 类。

电影.java

public class Film {
    private String film_id;
    private String title;
    private String description;
    private String length;
    private String image_id;
    private Image image;
//setter and getter methods
}

Image.java

public class Image {
    private int image_id;
    private String name;
    private int size;
    private String type;
    private byte[] content;
//setter and getter methods
}

请帮助我是新手,我应该使用 JAXB。

解决方案:

我已经添加了

@XmlRootElement(name = "film")
public class Film {
    private int film_id;
    private String title;
    private String description;
    private int length;
    private int image_id;
    private Image image;
}

在Image的getter方法上,我添加了@XMLElement(name="image")。

在 Image 类上,我添加了注释 @XmlRootElement(name = "image"),这给了我想要的。

【问题讨论】:

  • 意外元素(uri:“”,本地:“电影”)。预期的元素是(无).....这是我尝试时遇到的错误。 public void unmarshaling(String output) throws JAXBException { InputStream is = new StringBufferInputStream(output); JAXBContext jc = JAXBContext.newInstance(Film.class);解组器 u = jc.createUnmarshaller();电影film = (Film) u.unmarshal(is);
  • 你为什么不编辑你的问题而不是写难以阅读的 cmets?

标签: java xml jaxb unmarshalling


【解决方案1】:

尝试将您的数组转换为复制类列表(为我工作)

正如我所见 byte[] -> List

【讨论】:

  • List 不是一个好主意。它会在生成的 XML 中每个字节生成一个元素。在大多数情况下,这不是您想要的,并且会增加 XML 的大小。
【解决方案2】:

让您的用例工作所需的唯一事情是在 Film 类上添加一个 @XmlRootElement 注释:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Film")
public class Film {
    private String film_id;
    private String title;
    private String description;
    private String length;
    private String image_id;
    private Image image;
}

解决方案的另一部分

在Image的getter方法上,我添加了@XMLElement(name="image")。

在 Image 类上,我添加了一个注释 @XmlRootElement(name = “图像”),它给了我想要的东西。

这些步骤都不是映射您的特定用例所必需的。

【讨论】:

  • 是的,它不需要@XMLElement(name="image")。即使我将 @XMLElement(name="image") 标签嵌入到我的班级,我也会收到警告。这并没有影响我的输出。但是这个错误是关于什么的? ** 警告:出现重复的类定义错误?请报告:serviceone/client/entity/Image$JaxbAccessorM_getContent_setContent_[B java.lang.ClassFormatError: Illegal class name "serviceone/client/entity/Image$JaxbAccessorM_getContent_setContent_[B" in class file serviceone/client/entity/Image$JaxbAccessorM_getContent_setContent_[乙**
  • @Koushik - 您看到的异常特定于 JAXB 参考实现,而不是一般的 JAXB (JSR-222)。我建议通过以下链接报告此问题:java.net/jira/browse/JAXB
猜你喜欢
  • 2019-01-29
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 2012-09-12
  • 1970-01-01
相关资源
最近更新 更多