JAX-WS:javax.xml.bind.UnmarshalException

w0051977
//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中的异常。我可以在此处浏览到Web服务:http:// localhost:8080 / HelloRestService / webresources / generic

例外是:

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!。

尼古拉斯·菲洛托(Nicolas Filotto)

之所以会出现此错误,是因为您尝试用于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"));
    ...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

CXF中的javax.xml.bind.UnmarshalException

javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“ Group”)

javax.xml.bind.UnmarshalException:意外元素(uri:

Jenkins - 解析抛出异常。javax.xml.bind.UnmarshalException

javax.xml.bind.UnmarshalException:意外元素(uri:“”,local:“ id”)。预期元素为(无)

NoClassDefFoundError:javax / xml / bind / UnmarshalException-Spring Security oauth2

JaxB Unmarshal异常:javax.xml.bind.UnmarshalException:意外元素。我哪里出问题了?

如何修复:javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“目录”)。预期元素为(无)

javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“ ClientConfigData”)。期望的元素是<{} clientConfigData>

JAXB客户端,无法读取响应:javax.xml.bind.UnmarshalException

javax.xml.bind.UnmarshalException:意外元素(uri:“ MyProtocol.xsd”,本地:“ MyFrame”)。预期元素为(无)

javax.xml.bind.UnmarshalException:意外元素(URI:“”,本地:“ NewDataSet”)。期望的元素是<{http://www.webserviceX.NET} string>

jaxb抛出javax.xml.bind.UnmarshalException:仅当在osgi捆绑包中运行时,期望的元素为(无)

Spring Boot Apache Camel(Red Hat Fuse)应用程序为 xml 定义的路由抛出异常:javax.xml.bind.UnmarshalException:意外元素

React Native构建失败-javax.xml.bind.UnmarshalException:无法创建com.android.repository.impl.genic.v1.TypeDetails的实例

球衣休息服务,显示异常javax.ws.rs.WebApplicationException:javax.xml.bind.MarshalException

javax/xml/bind/JAXBException

JAXB:.UnmarshalException-具有链接的异常:[javax.xml.stream.XMLStreamException

使用JAX-WS跟踪XML请求/响应

我怎样才能改变JAX-WS响应XML

删除JAX-WS消息中的XML声明

忽略JAX-WS客户端的XML验证

ClassNotFoundException:javax.xml.bind.JAXBException(再次)

用gradle构建javax / xml / bind / JAXBException

NoClassDefFoundError:javax.xml.bind.DatatypeConverter

javax.xml.bind无法解析

UnmarshalException:XML上的意外元素只是Marshaller

javax.xml.bind.JAXBException:不支持属性“ com.sun.xml.bind.defaultNamespaceRemap”

JAX-WS入门