[英]Calling a WCF service from Java
编辑:问题出在ResponseMessage
类中的[MessageHeader]
属性上; Metro / JAX-WS似乎无法处理这些属性。 将它们更改为[MessageBodyMember]
可解决此问题。
如标题所示,我需要获取一些Java 1.5代码才能调用WCF Web服务。 我已经下载并使用Metro生成了Java代理类,但是它们没有生成我所期望的,并且我相信这是由于WCF服务生成的WSDL所致。
我的WCF类如下所示(为简洁起见,省略了完整的代码):
public class TestService : IService
{
public TestResponse DoTest(TestRequest request)
{
TestResponse response = new TestResponse();
// actual testing code...
response.Result = ResponseResult.Success;
return response;
}
}
public class TestResponse : ResponseMessage
{
public bool TestSucceeded { get; set; }
}
public class ResponseMessage
{
[MessageHeader]
public ResponseResult Result { get; set; }
[MessageHeader]
public string ResponseDesc { get; set; }
[MessageHeader]
public Guid ErrorIdentifier { get; set; }
}
public enum ResponseResult
{
Success,
Error,
Empty,
}
生成的WSDL(当我浏览到http:// localhost / TestService?wsdl = wsdl0时 )如下所示:
<xsd:element name="TestResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" name="TestSucceeded" type="xsd:boolean" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ErrorIdentifier" type="q1:guid" xmlns:q1="http://schemas.microsoft.com/2003/10/Serialization/" />
<xsd:simpleType name="ResponseResult">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Error" />
<xsd:enumeration value="Success" />
<xsd:enumeration value="EmptyResult" />
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="ResponseResult" nillable="true" type="tns:ResponseResult" />
<xsd:element name="Result" type="tns:ResponseResult" />
<xsd:element name="ResultDesc" nillable="true" type="xsd:string" />
...
<xs:element name="guid" nillable="true" type="tns:guid" />
<xs:simpleType name="guid">
<xs:restriction base="xs:string">
<xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" />
</xs:restriction>
</xs:simpleType>
我立即看到此WSDL的问题: TestResponse
不包含从ResponseMessage
继承的属性。 由于此服务一直在Visual Studio中运行,因此我以前从未对此提出质疑,但是也许这可能引起我的问题?
无论如何,当我在服务上运行Metro的wsimport.bat
时,会生成以下错误消息:
[WARNING] src-resolve.4.2: Error resolving component 'q1:guid'
并且输出的Java版本的TestResponse
缺少ResponseMessage
任何属性。
我稍微修改了WSDL,并将ErrorIdentifier
更改为xsd:string
,这使解决GUID类型的消息消失了,但是我仍然没有得到ResponseMessage
的任何属性。
最后,我将WSDL更改为在TestResponse
包含ResponseMessage
的3个属性,当然最终结果是生成的.java文件包含它们。 但是,当我实际从Java调用WCF服务时,这3个属性始终为null
。
除了自己编写代理类外,还有什么建议吗?
一些#%$ ^ @! 在不通知任何人的情况下,将ResponseMessage
属性的[MessageBodyMember]
属性更改为[MessageHeader]
。 我将它们更改回[MessageBodyMember]
,重新生成了代理类,并且一切正常。
一旦完成集成,我将进行CVS差异查找负责人,然后他们将遭受我的伤害。
此问题与Java无关,而仅与正在生成的WSDL有关。
为什么在TestResponse和ResponseMessage类上不使用[DataContract]
和[DataMember]
? 尝试一下,看看是否可行。
嗯,我并不是说要成为glib或拒绝Java本地解决方案,但是当涉及Wcf堆栈时,最好的建议通常是使用 Wcf堆栈。
更重要的是:生成CLR Wcf客户端(使用选择的语言,通过VS或svcutil针对静态wsdl或服务端点自动生成客户端),然后通过一些Java-CLR互操作调用此CLR代理。
造成这种情况的原因有很多,其中至少有一些原因
ps:我对手动修改现有服务wsdls表示强烈怀疑。 如果wsdl确实是“问题”,则表明服务定义存在问题(即服务器端代码)或服务解释存在问题(即自动生成实用程序的选项)。 避免手动操作服务合同。 这样做就像在构建后修改IL字节码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.