2016-10-18 11 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(); 
    } 
} 

Я выделил строку, которая вызывает исключение в: JavaApplication3.java. Я могу просматривать на веб-сервиса здесь: http://localhost:8080/HelloRestService/webresources/genericJAX-WS: javax.xml.bind.UnmarshalException

Исключение:

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 

В чем проблема? Я ожидаю, что переменная str будет заполнена HelloWorld !.

ответ

1

Вы получаете эту ошибку, потому что вы пытаетесь использовать JAXB, чтобы связать содержание, которое даже не XML содержания, которое просто не может работать (как напоминание JAXB означает Java Architecture for XML Binding). То, что вы действительно получаете, это plain/text даже не text/html, как вы установили в своем коде, а JAXB ожидает XML.

Что вам нужно сделать, это преобразовать входной поток в String с чем-то вроде этого:

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

Спасибо, но Я получаю ошибку с кодом является ~: Исключение в потоке «основной» ява .lang.NullPointerException: charsetName – w0051977

+0

просто укажите кодировку «null», и все должно быть хорошо, используйте «StandardCharsets.UTF_8' например –

+0

Спасибо. Можете ли вы ответить на мой другой вопрос здесь: http://stackoverflow.com/questions/40045883/windows-client-and-linux-ubuntu-server? Я новичок в Java (я .NET Developer). – w0051977

 Смежные вопросы

  • Нет связанных вопросов^_^