2016-10-18 3 views
1
//HelloWorld.java 
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("text/html") 
    public String getHtml() { 
     return "Hello World"; 
    } 
} 

//ApplicationConfig.java 
import java.util.Set; 
import javax.ws.rs.core.Application; 
@javax.ws.rs.ApplicationPath("webresources") 
public class ApplicationConfig extends Application { 
    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> resources = new java.util.HashSet<>(); 
     addRestResourceClasses(resources); 
     return resources; 
    } 
    private void addRestResourceClasses(Set<Class<?>> resources) { 
     resources.add(HelloWorld.class); 
    } 
} 

//JavaApplication3 
package javaapplication3; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import sun.misc.IOUtils; 
public class JavaApplication3 { 
    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 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", "text/html"); 
     JAXBContext jc = JAXBContext.newInstance(String.class); 
     InputStream xml = connection.getInputStream(); 
     String str = (String) jc.createUnmarshaller().unmarshal(xml); //line that throws exception 
     connection.disconnect(); 
    } 
} 

J'ai marqué la ligne, ce qui provoque l'exception dans: JavaApplication3.java. Je peux passer en revue au service web ici: http://localhost:8080/HelloRestService/webresources/genericJAX-WS: javax.xml.bind.UnmarshalException

L'exception est:

Exception in thread "main" javax.xml.bind.UnmarshalException 
- with linked exception: 
[org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.] 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:335) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:563) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:249) 
    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:41) 
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog. 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327) 
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1465) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:999) 
    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) 
    ... 4 more 
Java Result: 1 

Quel est le problème? Je m'attends à ce que la variable str soit remplie avec HelloWorld !.

Répondre

1

Vous obtenez cette erreur parce que vous essayez d'utiliser JAXB pour lier un contenu qui est même pas un contenu XML qui peut tout simplement pas (comme rappel JAXB est synonyme de Java Architecture for XML Binding). Ce que vous obtenez vraiment est plain/text pas même text/html que vous définissez dans votre code tandis que JAXB attend XML.

Ce que vous devez faire, est de convertir votre flux d'entrée en un String avec quelque chose comme ceci:

try (
    BufferedReader reader = new BufferedReader(
     new InputStreamReader(connection.getInputStream(), charset) 
    ) 
) { 
    String content = reader.lines().collect(Collectors.joining("\n")); 
    ... 
} 
+0

Merci, mais l'erreur que je reçois avec votre code est ~: Exception dans le thread java « principal » .lang.NullPointerException: charsetName – w0051977

+0

juste fournir un jeu de caractères non 'null' et ça devrait aller, utilisez' StandardCharsets.UTF_8' par exemple –

+0

Merci. Êtes-vous capable de répondre à mon autre question ici: http://stackoverflow.com/questions/40045883/windows-client-and-linux-ubuntu-server? Je suis nouveau à Java (je suis un développeur .NET). – w0051977