2014-10-16 30 views
0

我已經使用wsimport命令行(JAX-WS)生成了Web服務客戶端,並使用JAXB生成了Java對象並將其分開XSD文件。JAX-WS客戶端,不正確的soap請求 - 根元素之後的文檔中的標記必須格式良好

但是,當我嘗試請求時,它會從服務器端提供以下錯誤。

SAXException, cause: The markup in the document following the root element must be well-formed.

所以我檢查了我的肥皂請求與示例工作肥皂消息。然後我意識到這兩條消息之間有一個不同。

1.示例工作消息。

<m:getMyDetail xmlns:m="http://axis.frontend.hi.example.net"> 
<MyDetailRQ xmlns="http://www.example.net/schemas/1005/06/messages" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.example.net/1005/06/messages ../xsd/MyDetailRQ.xsd" 
version="2013/12"> 

2. Web服務客戶端生成的SOAP消息。

<ns3:getMyDetail xmlns:ns3="http://axis.frontend.hi.example.net" xmlns="http://www. 
example.net/schemas/1005/06/messages" xmlns:ns2="http://www. example.net/wsdl/1005/06" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="MyDetailRQ"> 

正如你可以看到,預期MyDetailRQ包裝標籤元件上方是缺少,但它作爲產生的xsi:類型= 「MyDetailRQ」 屬性。

我不知道爲什麼會發生這種情況,以及如何通過我的客戶端項目配置來解決此問題。

感謝您的幫助和建議。

感謝

- 相關WSDL部分

<wsdl:types> 
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://axis.frontend.h1.example.com"> 
     <element name="getMyDetail" type="xsd:anyType"/> 
    </schema> 
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/wsdl/2005/06"> 
     <element name="getMyDetailReturn" type="xsd:anyType"/> 
    </schema> 
</wsdl:types> 
<wsdl:message name="getMyDetailRequest"> 
    <wsdl:part element="tns1:getMyDetail" name="part"/> 
</wsdl:message> 
<wsdl:message name="getMyDetailResponse"> 
    <wsdl:part element="impl:getMyDetailReturn" name="getMyDetailReturn"/> 
</wsdl:message> 
<wsdl:portType name="MyService"> 
    <wsdl:operation name="getMyDetail"> 
     <wsdl:input message="impl:getMyDetailRequest" name="getMyDetailRequest"/> 
     <wsdl:output message="impl:getMyDetailResponse" name="getMyDetailResponse"/> 
    </wsdl:operation> 
</wsdl:portType> 
<wsdl:binding name="MyServiceSoapBinding" type="impl:MyService"> 
    <wsdl:operation name="getMyDetail"> 
     <wsdlsoap:operation soapAction=""/> 
     <wsdl:input name="getMyDetailRequest"> 
      <wsdlsoap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output name="getMyDetailResponse"> 
      <wsdlsoap:body use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 
</wsdl:binding> 
<wsdl:service name="MyServiceService"> 
    <wsdl:port binding="impl:MyServiceSoapBinding" name="MyService"> 
     <wsdlsoap:address location="http://interface.example.com/xmls/ws/MyService"/> 
    </wsdl:port> 
</wsdl:service> 

- 相關XSD部分

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns="http://www.example.net/schemas/1005/06/messages" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.net/schemas/1005/06/messages" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:include schemaLocation="MyCommonTypes.xsd"/> 
    <xs:element name="MyDetailRQ"> 

- 相關的Java對象

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "MyDetailRQ", propOrder = { 
    "myCode" 
}) 
@XmlRootElement(name = "MyDetailRQ") 
public class MyDetailRQ 
    extends MainRequest 
{ 
} 

- Web服務客戶端 - 服務接口(更新於10月17日2014)

@WebService(name = "MyService", targetNamespace = "http://www.example.net/wsdl/1005/06") 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 
@XmlSeeAlso({ 
    com.myp.hi.frontend.axis.ObjectFactory.class, 
     com.myp.ObjectFactory.class 
}) 
public interface MyService { 
    /** 
     * 
     * @param part 
     * @return 
     *  returns java.lang.Object 
     */ 
     @WebMethod 
     @WebResult(name = "getMyDetailReturn", targetNamespace = "http://www.example.net/wsdl/1005/06", partName = "getMyDetailReturn") 
     public Object getMyDetail(
      @WebParam(name = "getMyDetail", targetNamespace = "http://axis.frontend.hi.example.net", partName = "part") 
      Object part); 

} 

- ObjectFactory類(更新於10月17日2014)

@XmlRegistry 
public class ObjectFactory { 

    private final static QName _GetMyDetail_QNAME = new QName("http://axis.frontend.hi.example.net", "getMyDetail"); 


    public ObjectFactory() { 
    } 

    @XmlElementDecl(namespace = "http://axis.frontend.hi.example.net", name = "getMyDetail") 
      public JAXBElement<Object> createGetMyDetail(Object value) { 
      return new JAXBElement<Object>(_GetMyDetail_QNAME, Object.class, null, value); 
    } 


} 

-MyServiceService class(2014年10月17日更新)

@WebServiceClient(name = "MyServiceService", targetNamespace = "http://www.example.net/wsdl/1005/06", wsdlLocation = "http://interface.example.com/xmls/ws/MyService?wsdl") 
@GZIP 
public class MyServiceService 
    extends Service 
{ 

    private final static URL MYSERVICESERVICE_WSDL_LOCATION; 
    private final static WebServiceException MYSERVICESERVICE_EXCEPTION; 
    private final static QName MYSERVICESERVICE_QNAME = new QName("http://www.example.net/wsdl/1005/06", "MyServiceService"); 

    static { 
     URL url = null; 
     WebServiceException e = null; 
     try { 
      url = new URL("http://interface.example.com/xmls/ws/MyService?wsdl"); 
     } catch (MalformedURLException ex) { 
      e = new WebServiceException(ex); 
     } 
     MYSERVICESERVICE_WSDL_LOCATION = url; 
     MYSERVICESERVICE_EXCEPTION = e; 
    } 

@WebEndpoint(name = "MyService") 
    public MyService getMyService() { 

     MyService port = super.getPort(new QName("http://www.example.net/wsdl/1005/06", "MyService"), MyService.class); 
     return port; 
    } 

private static URL __getWsdlLocation() { 
     if (MYSERVICESERVICE_EXCEPTION!= null) { 
      throw MYSERVICESERVICE_EXCEPTION; 
     } 
     return MYSERVICESERVICE_WSDL_LOCATION; 
    } 


} 

- 我的測試類(更新於10月17日2014)

MyService myService = new MyServiceService().getMyService(); 

MyDetailRQ myDetailRQ = new MyDetailRQ(); 


myDetailRQ.setCredentials(credentials); 
myDetailRQ.setLanguage("ENG"); 
myDetailRQ.setMyCode("52319"); 

MyDetailRS myDetailRS = (MyDetailRS) myService.getMyDetail(myService); 
+0

如何構建'getMyDetail'實例? – lexicore 2014-10-16 20:39:14

+0

我希望你正在關注ObjectFactory,任何我已經更新了包含測試類的所有信息的問題。 感謝您的檢查。 – Unknown 2014-10-17 05:01:29

+0

當在MyDetailRQ中將空白設置爲@XmlType(name =「」,propOrder = {「hotelCode」})時,出現以下錯誤。 'org.apache.cxf.interceptor.Fault:編組錯誤:「com.myp.hi.dataobject.MyDetailRQ」的實例將替換爲「java.lang.Object」,但「com.mpy.hi.dataobject.MyDetailRQ」爲綁定到匿名類型「。 – Unknown 2014-10-17 06:50:35

回答

0

我已經找到了解決方案,但不知道是否完美的一個。

我所做的是;傳遞一個XML字符串作爲服務的字符串並獲得響應。 然後手動進行編組和取消編組。

請看下面的例子。

MyService myService = new MyServiceService().getMyService(); 

MyDetailRQ myDetailRQ = new MyDetailRQ(); 


myDetailRQ.setCredentials(credentials); 
myDetailRQ.setLanguage("ENG"); 
myDetailRQ.setMyCode("52319"); 

String requestStr = getStringFromJaxb(myDetailRQ.class, myDetailRQ); 

String responseStr = (String) myService.getMyDetail(requestStr); 

MyDetailRS myDetailRS = (MyDetailRS) getJaxbFromString(MyDetailRS.class, responseStr); 




private static Object getJaxbFromString(Class<?> clazz, String xmlString) { 
     StringReader input = null; 
     Object o = null; 
     try { 
      input = new StringReader(xmlString); 
      JAXBContext context = JAXBContext.newInstance(clazz); 
      Unmarshaller um = context.createUnmarshaller(); 
      o = um.unmarshal(input); 
      if (o instanceof JAXBElement) 
       o = ((JAXBElement<?>) o).getValue(); 
     } catch (JAXBException e) { 
      e.printStackTrace(); 
     } finally { 
      if (input != null) 
       input.close(); 
     } 
     return o; 
    } 



/** 
    * Helper method to get xml string from JAXB Object. 
    * @param clazz 
    * @param o 
    * @return 
    */ 
    private static String getStringFromJaxb(Class<?> clazz, Object o) { 
     String theXML = ""; 
     try { 
      StringWriter writer = new StringWriter(); 
      JAXBContext context = JAXBContext.newInstance(clazz); 
      Marshaller m = context.createMarshaller(); 
      m.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE); 
      m.marshal(o, writer); 

      // output string to console 
      theXML = writer.toString(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return theXML; 
    } 
相關問題