2016-10-24 11 views
0

Я .NET Developer, изучающий Java. Пожалуйста, смотрите код ниже:Исключение в теме "main" javax.xml.bind.UnmarshalException

Класс 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) 

я пометил строку, которая заставляет исключение. В чем проблема?

+0

Что именно вы хотите сделать? получить результат как 'String' или как java bean? –

+0

В какой версии Java EE вы используете 6 или 7? –

+0

@Nicolas Filotto, оба. Два звонка. Первый должен вернуть XML-строку, а второй - Java-компонент. – w0051977

ответ

1

Основная цель JAXB это сделать отображение между XML и Java Bean, но чтобы быть в состоянии сделать это, он опирается на аннотации из javax.xml.bind.annotation, что вам нужно объявить на полях или на добытчиков вашей цели Java Bean ,

Так, например, здесь, ваше отображение может быть определена как следующая:

Класс 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.