簡體   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