2014-10-16 1 views
0

Я создал клиента веб-службы с использованием командной строки wsimport (JAX-WS) и сгенерированных объектов Java с использованием JAXB и отдельных XSD-файлы.Клиент JAX-WS, неправильный запрос на мыло. Разметка в документе, следующий за корневым элементом, должна быть хорошо сформирована.

Но когда я пытаюсь выполнить запрос, он дает следующую ошибку со стороны сервера.

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. Клиент веб-службы генерируется мыльный сообщение.

<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 
{ 
} 

- обслуживание клиентов веб - интерфейс службы (Обновлено 17-Oct-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 класс (Обновлено 17-Oct-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 (Обновлено 17 октября 2014 года)

@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; 
    } 


} 

- Мой тест Класс (Обновлено 17-Oct-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

+0

Надеюсь, вы принимаете ObjectFactory, так как я обновил проблему со всей информацией, которую я имею, включая тестовый класс. Спасибо за проверку. – Unknown

+0

Когда значение пуста для @XmlType (name = "", propOrder = {"hotelCode"}) в MyDetailRQ, я получаю следующую ошибку. 'org.apache.cxf.interceptor.Fault: Ошибка маршаллинга: экземпляр «com.myp.hi.dataobject.MyDetailRQ» заменяет «java.lang.Object», но «com.mpy.hi.dataobject.MyDetailRQ» является связанный с анонимным типом ». – Unknown

ответ

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; 
    } 

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

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