2016-10-18 1 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

당신은 단순히 (Java Architecture for XML Binding을 의미 JAXB 신호로) 작동하지 않을 수 있습니다 심지어 XML 내용이 아닌 내용을 바인딩 JAXB을 사용하려고 때문에이 오류가 발생합니다. 실제로 얻을 수있는 것은 plain/texttext/html도 아니고 JAXBXML 일 때 코드에 설정 한 것조차 아닙니다.

당신이해야 할 일은, 이런 식으로 뭔가가있는 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이 아닌'nullset charset을 제공하고 괜찮습니다. 예를 들어'StandardCharsets.UTF_8'을 사용하십시오 –

+0

고마워요. 내 다른 질문에 대답 할 수 있습니까? http://stackoverflow.com/questions/40045883/windows-client-and-linux-ubuntu-server? Java에 익숙하지 않습니다 (.NET 개발자). – w0051977

관련 문제