2016-10-24 5 views
0

Je suis un développeur .NET Java. S'il vous plaît voir le code ci-dessous:Exception dans le fil "principal" javax.xml.bind.UnmarshalException

La classe 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>"; 
    } 
} 

La classe 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();  
    } 

} 

L'exception renvoyée est:

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) 

J'ai marqué la ligne qui provoque la exception. Quel est le problème?

+0

Que voulez-vous faire exactement? obtenir le résultat en tant que 'String' ou en tant que bean java? –

+0

quelle version de Java EE utilisez-vous 6 ou 7? –

+0

@Nicolas Filotto, les deux. Deux appels. Le premier devrait renvoyer une chaîne XML et le second un bean Java. – w0051977

Répondre

1

Le but principal de JAXB est de faire la correspondance entre XML et un Java Bean mais pour être en mesure de le faire, elle repose sur les annotations de javax.xml.bind.annotation que vous devez déclarer sur les champs ou sur les apporteurs de votre cible Java Bean .

Ainsi, par exemple ici, votre cartographie pourrait être définie comme suivant:

La classe 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; 
    } 
} 

La classe 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; 
    } 
} 

Une fois que vous avez défini votre carte, vous devez pour le fournir à votre JAXBContext pour être en mesure de unmarshal votre contenu XML à obtenir une instance de la classe Parts:

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

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

Voici a good tutorial à propos JAXB que vous devriez lire. Vous devriez également lire the one from oracle.