SOAPFaultException при развертывании на Tomcat, но отлично работает в GlassFish - PullRequest
3 голосов
/ 13 марта 2012

Друзья, я много пробовал и читал много форумов, но не мог понять, почему возникла эта проблема.
Я создал Jax-WS WebService, используя контрактный подход.Создал WSDL & XSD, а затем использовал инструмент wsimport для генерации остальных артефактов, предоставил реализацию для SEI.

Развернул приложение WebService на GlassFish в Eclipse Helios (адаптер и плагин Glassfish установлены в Eclipse).Протестировал развернутую службу через SoapUI, и она отлично работает.

Я развернул эту веб-службу в Tomcat7.0 в виде файла WAR.Структура как:

WAR -> META-INF -> MANIFEST.MF<br/>
    -> WEB-INF -> classes -> ...<br/>
               -> wsdl -> .wsdl and .xsd<br/>
               -> web.xml<br/>
               -> sun-jaxws.xml<br/>

Когда я тестирую веб-сервис через SoapUI, ответ, который я получаю, является исключением:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
        <faultcode>S:Server</faultcode>
        <faultstring>unexpected XML tag. expected: {http://localhost/fundmanagertd}addFund but found: {http://localhost/fundmanagertd}requestAddFund</faultstring>
      </S:Fault>
   </S:Body>
</S:Envelope>

Я думаю, что он работает в Glassfish, потому что Glassfishгенерирует все артефакты на лету и не принимает уже созданные.Пока Tomcat берет только те, которые находятся в развернутом пакете.Почему я так думаю, потому что веб-сервисы работают в Glassfish только тогда, когда sun-jaxws.xml не предоставлен, но когда он предоставлен, я не могу увидеть сервис в разделе «Развернутая служба».В то время как Tomcat использует sun-jasws.xml и использует предоставленные мною классы, но не работает.Я не знаю, почему это происходит.Любое направление отсюда будет высоко ценится.

WSDL Я использую:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions targetNamespace="http://localhost/fundmanagertd" name="FundManagerTDService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://localhost/fundmanagertd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://localhost/fundmanagertd" schemaLocation="FundManagerTDService_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="addFund">
    <part name="parameters" element="tns:requestAddFund"/>
  </message>
  <message name="addFundResponse">
    <part name="parameters" element="tns:responseAddFund"/>
  </message>
  <portType name="Fund">
    <operation name="addFund">
      <input message="tns:addFund"/>
      <output message="tns:addFundResponse"/>
    </operation>
  </portType>
  <binding name="FundPortBinding" type="tns:Fund">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="addFund">
      <soap:operation soapAction="urn:Add"/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="FundManagerTDService">
    <port name="FundPort" binding="tns:FundPortBinding">
      <soap:address location="REPLACE_WITH_ACTUAL_URL"/>
    </port>
  </service>
</definitions>

FundManagerTDService_schema1.xsd

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://localhost/fundmanagertd" xmlns:tns="http://localhost/fundmanagertd" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="requestAddFund" type="tns:requestAddFund"/>

  <xs:element name="responseAddFund" type="tns:responseAddFund"/>

  <xs:complexType name="fund">
    <xs:sequence>
      <xs:element name="annuity" type="tns:annuityType" minOccurs="0"/>
      <xs:element name="duration" type="xs:int"/>
      <xs:element name="endDate" type="xs:dateTime" minOccurs="0"/>
      <xs:element name="id" type="xs:long"/>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="premium" type="xs:float"/>
      <xs:element name="startDate" type="xs:dateTime" minOccurs="0"/>
      <xs:element name="type" type="tns:investmentType" minOccurs="0"/>
      <xs:element name="value" type="xs:float"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="requestAddFund">
    <xs:sequence>
      <xs:element name="arg0" type="tns:fund" minOccurs="0"/>
      <xs:element name="arg1" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="responseAddFund">
    <xs:sequence>
      <xs:element name="return" type="xs:long"/>
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="annuityType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="MONTHLY"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="investmentType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="MF"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

SoapUI генерирует запрос автоматически, и это:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:fun="http://localhost/fundmanagertd">
   <soapenv:Header/>
   <soapenv:Body>
      <fun:requestAddFund>
         <!--Optional:-->
         <arg0>
            <!--Optional:-->
            <annuity>?</annuity>
            <duration>?</duration>
            <!--Optional:-->
            <endDate>?</endDate>
            <id>?</id>
            <!--Optional:-->
            <name>?</name>
            <premium>?</premium>
            <!--Optional:-->
            <startDate>?</startDate>
            <!--Optional:-->
            <type>?</type>
            <value>?</value>
         </arg0>
         <!--Optional:-->
         <arg1>?</arg1>
      </fun:requestAddFund>
   </soapenv:Body>
</soapenv:Envelope>

Кроме того, я попытался создать статический клиент для доступа к моему веб-сервису, и я получаю SOAPFaultException с «неожиданным сообщением тега XML ...»

Кроме того, добавив sun-jaxws.xml для справки:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints
  xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
  version="2.0">
  <endpoint
      name="fundmanagertdservice"
      implementation="com.investment.webservice.impl.FundManagerService"
      url-pattern="/fundmanagertdsvr"
      wsdl="WEB-INF/wsdl/FundManagerTDService.wsdl"/>
</endpoints>

Спасибо,

1 Ответ

0 голосов
/ 19 августа 2012

Я думаю, что первым элементом в теле запроса SOAP должны быть операции, которые вы вызываете.Это означает, что автоматически сгенерированный XML должен быть изменен.Это именно то, что говорит ошибка:

... ожидается:

... addFund - имя метода - но найдено:

... requestAddFund- имя типа данных

...