[英]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.