【问题标题】:Parse SOAP XML response, Error: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog解析 SOAP XML 响应,错误:org.xml.sax.SAXParseException;行号:1;列号:1;序言中不能有内容
【发布时间】:2018-08-10 08:45:47
【问题描述】:

预期输出:
- 通过输入 ZipCode 作为输入获取供应商详细信息

问题:
- 在 SupplierDetail.java
中的 try catch 块的第 3 行显示错误 - 解组时抛出异常。查看错误日志

javax.xml.bind.UnmarshalException - 带有链接异常: [org.xml.sax.SAXParseException;行号:1;列号:1; 序言中不允许有内容。]

WSDL
端点 http://www.webservicex.net/medicareSupplier.asmx?WSDL

使用 GetSupplierByZipCode 方法从给定的 WSDL 获取供应商详细信息

第 1 步:使用 wsimport 工具生成存根

wsimport -keep -d "路径" http://www.webservicex.net/medicareSupplier.asmx?WSDL

第 2 步:创建动态 Web 项目 1.将生成的文件添加到项目中

以下是代码
index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>MediCare SOAP Client </title>
</head>
<body>
<h2>Hello JSP</h2>

<form method="post" action="supplierdetail">
<label>Zip Code</label>
<input type="text" name="searchBarInputId">
<input type="submit" value="Get Supplier">
</form>

</body>
</html>

SupplierDetail.java

package com.supplier;

import java.io.IOException;
import java.io.StringReader;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;


import net.webservicex.MediCareSupplier;
import net.webservicex.MediCareSupplierSoap;
import net.webservicex.SupplierData;

public class SupplierDetail extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String cityZipCode = request.getParameter("searchBarInputId");
        System.out.println("doPost:"+ cityZipCode);
        MediCareSupplier mediCareObj  = new MediCareSupplier();
        MediCareSupplierSoap mediCareSupplier = mediCareObj.getMediCareSupplierSoap();
        mediCareSupplier.getSupplierByZipCode(cityZipCode, null, null);

        try {
            JAXBContext jAXBContext = JAXBContext.newInstance(SupplierData.class);
            Unmarshaller unmarshaller = jAXBContext.createUnmarshaller();
            SupplierData data = (SupplierData)unmarshaller.unmarshal(new StringReader(response.toString()));
            System.out.println("SupplierDAta: "+data+':'+ data.getSupplierNumber()+ "\n"+data.getAddress1());

            /* RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/SupplierDetails.jsp");
             dispatcher.forward(request, response);*/ 

        } catch (JAXBException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
    }
}

错误日志:

信息:服务器在 610 毫秒内启动 doPost:61244 javax.xml.bind.UnmarshalException - 带有链接异常:[org.xml.sax.SAXParseException;行号:1;列号:1;序言中不允许有内容。] 在 javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(未知 来源)在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(未知 来源)在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(未知 来源)在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(未知 来源)在 javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(未知 来源)在 javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(未知 来源)在 com.supplier.SupplierDetail.doPost(SupplierDetail.java:36) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:661) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Unknown Source) 引起: org.xml.sax.SAXParseException;行号:1;列号:1;内容 在序言中是不允许的。在 com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(未知 来源)在 com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(未知 来源)在 com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(未知 来源)在 com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(未知 来源)在 com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(未知 来源)在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(未知 来源)在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(未知 来源)在 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(未知 来源)在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(未知 来源)在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知 来源)在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知 来源)在 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(未知 来源)在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(未知 来源)在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(未知 来源)... 28 更多

请帮忙.. 提前致谢

【问题讨论】:

    标签: java jsp servlets soap wsdl


    【解决方案1】:

    你为什么要 Unmarshall 响应?下面的代码有什么意义?SupplierData data = (SupplierData)unmarshaller.unmarshal(new StringReader(response.toString()));

    如果您的目的是让 SOAP 响应您已经拥有它,请通过 mediCareSupplier.getSupplierByZipCode(cityZipCode, null, null);。(我认为您的代码在 try 块之前正确执行)。

    【讨论】:

      【解决方案2】:

      找到另一个解决方案

      返回多个值

      使用 SOAP,可以在单个请求中返回多个值。这在 Java 中是不可能的,因为方法只能返回一个对象。

      JAX-WS 用 Holders 的概念解决了这个问题。 javax.xml.ws.Holder 是一个简单的包装对象,可以作为参数传递给@WebService 方法。应用程序在请求期间设置持有者的值,服务器会将值作为 OUT 参数发回。

          MediCareSupplier mediCare = new MediCareSupplier();
          MediCareSupplierSoap mediCareSOAP = mediCare.getMediCareSupplierSoap();
      
          Holder<Boolean> getSupplierByZipCodeResult = new Holder<Boolean>();
          Holder<SupplierDataList> supplierDataLists = new Holder<SupplierDataList>();
          mediCareSOAP.getSupplierByZipCode(zip, getSupplierByZipCodeResult, supplierDataLists);
      
          List<SupplierData> supplierDataList = supplierDataLists.value.getSupplierDatas().getSupplierData();
      

      遍历supplierDataList并获取所有数据

      【讨论】:

        猜你喜欢
        • 2017-07-23
        • 2022-10-13
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        相关资源
        最近更新 更多