繁体   English   中英

从Java调用WCF服务

[英]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代理。

造成这种情况的原因有很多,其中至少有一些原因

  • 立即合规[由Wcf for Wcf]
  • 灵活性[期望您的远程服务更改或利用消息级别的加密等复杂的通信协议,您希望您的客户端像服务一样容易地更改,这是不合理的]

ps:我对手动修改现有服务wsdls表示强烈怀疑。 如果wsdl确实是“问题”,则表明服务定义存在问题(即服务器端代码)或服务解释存在问题(即自动生成实用程序的选项)。 避免手动操作服务合同。 这样做就像在构建后修改IL字节码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM