【问题标题】:Exception in thread "main" javax.xml.bind.UnmarshalException线程“主”javax.xml.bind.UnmarshalException 中的异常
【发布时间】:2016-10-24 09:19:41
【问题描述】:

我是一名学习 Java 的 .NET 开发人员。请看下面的代码:

班级HelloWorld

import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PUT;
import javax.ws.rs.core.MediaType;

@Path("generic")
public class HelloWorld {
    @Context
    private UriInfo context;
    public HelloWorld() {
    }
    @GET
    @Produces("application/xml")
    public String getHtml() {
        return "<?xml version='1.0'?><PARTS><TITLE>Computer Parts</TITLE><PART><ITEM>Motherboard</ITEM></PART></PARTS>";
    }
}

班级JavaApplication3

package javaapplication3;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.stream.Collectors;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import sun.misc.IOUtils;

/**
 *
 * @author 3212627
 */
public class JavaApplication3 {
    private static String charset;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws MalformedURLException, IOException, JAXBException {
        //Get the URI by selecting the RESTful web services folder under the web app project.   Then right click on the underlying node
        //and select: TestResourceURI
        String content;
        String uri ="http://localhost:8080/HelloRestService/webresources/generic";
        URL url = new URL(uri);
        HttpURLConnection connection =  (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        //connection.setRequestProperty("Accept", "application/xml");
        connection.setRequestProperty("Accept", "application/xml");

        JAXBContext jc = JAXBContext.newInstance(String.class); //I changed Customer.class to String.class

        InputStream xml = connection.getInputStream();
        String str = (String) jc.createUnmarshaller().unmarshal(xml); //line causing exception
        connection.disconnect();       
    }

}

返回的异常是:

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"PARTS"). Expected elements are (none)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:247)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:242)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:109)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1131)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:556)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:538)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:380)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:619)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3129)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:880)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:504)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:243)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:204)
    at javaapplication3.JavaApplication3.main(JavaApplication3.java:46)
Java Result: 1
BUILD SUCCESSFUL (total time: 5 seconds)

我已经标记了导致异常的行。有什么问题?

【问题讨论】:

  • 你到底想做什么?得到String 或java bean 的结果?
  • Java EE 6 还是 7 的哪个版本?
  • @Nicolas Filotto,两者都有。两个电话。第一个应该返回一个 XML 字符串,第二个应该返回一个 Java Bean。

标签: java jakarta-ee jax-ws netbeans-7


【解决方案1】:

JAXB 的主要目的是在 XMLJava Bean 之间进行映射,但要做到这一点,它依赖于来自 javax.xml.bind.annotation 的注释,您需要在字段或目标 Java Bean 的 getter。

例如在这里,您的映射可以定义为下一个:

班级Parts

public class Parts {
    @XmlElement(name = "TITLE")
    private String title;
    @XmlElement(name = "PART")
    private List<Part> parts;

    public String getTitle() {
        return this.title;
    }

    public void setTitle(final String title) {
        this.title = title;
    }

    public List<Part> getParts() {
        return this.parts;
    }

    public void setParts(final List<Part> parts) {
        this.parts = parts;
    }
}

班级Part

@XmlAccessorType(XmlAccessType.FIELD)
public class Part {
    @XmlElement(name = "ITEM")
    private String item;

    public String getItem() {
        return this.item;
    }

    public void setItem(final String item) {
        this.item = item;
    }
}

一旦你定义了你的映射,你需要将它提供给你的JAXBContext,以便能够unmarshal你的XML内容获得Parts类的一个实例:

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

InputStream xml = connection.getInputStream();
Parts parts = (Parts) jc.createUnmarshaller().unmarshal(xml); 

这是a good tutorial 关于JAXB,您应该阅读。您还应该阅读the one from oracle

【讨论】:

    猜你喜欢
    • 2016-07-22
    • 2013-02-17
    • 2013-12-20
    • 1970-01-01
    • 2014-03-31
    • 2013-05-06
    • 2017-11-12
    • 2015-01-17
    • 2011-04-13
    相关资源
    最近更新 更多