Java アプリから使用したい WCF サービスを作成しています。しかし、問題は .net-java 相互運用性に関するものではありません。
ポイントは、サービス操作に関係する型の1つがIXmlSerializableであることです。その型は、XmlSchemaProviderAttribute によって参照される静的メソッドを使用して XSD スキーマを返します。問題は、mex-endpoint ( http://..svc?wsdl ) を介してサービスの wsdl を取得すると、そのスキーマが返されないことです。
詳細はこちら。
一部の wcf サービス コントラクト:
[ServiceContract]
public interface IService1
{
[OperationContract]
DomainData GetData();
}
DomainData タイプは次のとおりです。
[DataContract(Namespace = "http://schemas.biz.org/Samples/customserialization")]
public class DomainData
{
[DataMember(Name = "AuxData")]
Dictionary<String, AuxDomainData> m_auxData = new Dictionary<string, AuxDomainData>();
[DataMember]
public string ObjectId { get; set; }
public IDictionary<string, AuxDomainData> AuxData
{
get { return m_auxData; }
}
}
ご覧のとおり、DomainData には AuxDomainData オブジェクトのディクショナリが含まれています。
[XmlSchemaProvider("GetXmlSerializationSchema")]
public class AuxDomainData : IXmlSerializable
{
[DataMember]
public Object AuxData { get; set; }
XmlSchema IXmlSerializable.GetSchema() { return null; }
void IXmlSerializable.ReadXml(XmlReader reader) { }
void IXmlSerializable.WriteXml(XmlWriter writer) { }
public static string Namespace = "http://schemas.biz.org/Samples/customserialization";
public static XmlQualifiedName GetXmlSerializationSchema(XmlSchemaSet schemas)
{
var qname = new XmlQualifiedName("AuxDomainData", Namespace);
string resourceName = "CustomSerialization.aux-domain-data.xsd";
using (Stream stream = typeof(AuxDomainData).Assembly.GetManifestResourceStream(resourceName))
{
var schema = XmlSchema.Read(stream, null);
schemas.Add(schema);
}
return qname;
}
}
ここでは、GetXmlSerializationSchema メソッドで XSD スキーマを返しています。スキーマ自体は簡単ですが、ここでは割愛させてください。
そのコードは簡単だと思いますが、これは IXmlSerializable 型の一般的なシナリオです。
ここで、WSDL が必要です。Metroの助けを借りて WSDL を使用して Java クライアントを作成しますが 、実際には JDK 1.6 で十分です。WS スタック (および wsimport.exe) が含まれているからです。したがって、Java は wsdl:service 定義で wsdl を必要とします。そのため、wsdl.exe から wsdl を渡すことができません (wsdl によって生成された wsdl には wsdl:service 定義が含まれておらず、wsdl:portType のみが含まれているため)。そこで、wsimport.bat http://localhost/Service1.svc?wsdlを呼び出します。
しかし、私がレスポーズで得たものは次のとおりです。
これは、構成された wsdl には実際には AuxDomainData などの型が含まれていないためです。それは真実であり、java/metro/その他のスタックを非難することはできません。wcf によって生成された wsdl を見ると、すべての xsd スキーマをインポートする wsdl:types 要素が含まれています。
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd0" namespace="http://tempuri.org/" />
<xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
<xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd2" namespace="http://schemas.biz.org/Samples/customserialization" />
<xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd3" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
</xsd:schema>
</wsdl:types>
ここですべての xsd を提供することはしませんが、要点はそれらに AuxDomainData 定義がないことです。AuxDomainData タイプの xsd-schema はhttp://localhost/CustomSerialization/Service1.svc?xsd=xsd 4 "document" にあります。しかし、ご覧のとおり、ルート wsdl にはそれへの参照が含まれていません。それが問題です。結果の wsdl/xsd スキーマ セットは完全ではありません。
それで、私のオプションは何ですか?