gpt4 book ai didi

java - 部署在 Tomcat 上时出现 SOAPFaultException,但在 GlassFish 中工作正常

转载 作者:行者123 更新时间:2023-12-02 09:39:35 25 4
gpt4 key购买 nike

friend 们,我已经尝试了很多并阅读了很多论坛,但无法理解为什么会出现这个问题。
我使用契约优先方法创建了 Jax-WS WebService。创建 WSDL 和 XSD,然后使用 wsimport 工具生成其余工件,为 SEI 提供实现。

将 WebService 应用程序部署到 Eclipse Helios 中的 GlassFish(Glassfish 适配器和插件安装在 Eclipse 中)。通过SoapUI测试部署的服务,工作正常。

我将此 Web 服务作为 WAR 文件部署到 Tomcat7.0 中。结构为:

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

When I test the webservice through SoapUI, the response I get is an exception as:

<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 仅获取已部署包中的内容。为什么我这么认为,因为仅当未提供 sun-jaxws.xml 时,Web 服务才能在 Glassfish 中工作,但是当提供它时,我无法在“已部署服务”部分下看到该服务。虽然 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>

此外,我尝试创建一个静态客户端来访问我的 Web 服务,但收到 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>

谢谢

最佳答案

我认为 SOAP 请求正文中的第一个元素必须是您正在调用的操作。这意味着需要更改自动生成的 XML。这正是错误所说的:

...expected:

...addFund - method name - but found:

...requestAddFund - data type name

关于java - 部署在 Tomcat 上时出现 SOAPFaultException,但在 GlassFish 中工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com