使用現有 Java 程式碼開發 SCA 服務 (已淘汰)
在使用現有的 Java™ 應用程式啟動時,您可以開發「服務元件架構 (SCA)」服務實作。
關於這項作業
有兩種方法可以開發 SCA 服務實作:
- 從現有的「Web 服務說明語言 (WSDL)」開始由上而下開發
- 從使用 Java Architecture for XML Binding (JAXB) 資料類型的現有 Java 程式碼開始由下而上開發
由下而上開發方法為 Java 開發人員提供了一種簡化的方式,可開始開發 SCA 服務,而 Java 開發人員不想要使用 WSDL 或 XML 綱目 (XSD) 編寫,或在建置新的 SCA 服務時使用 Java 介面來公開現有的舊式實作。
由上而下開發方法利用可交互作業的 XML 型 WSDL 及 XSD 介面和資料定義。
這項作業說明使用由下而上開發方法,在 Java 啟動時開發 SCA 服務實作時的步驟。
使用由下而上開發方法時,請先撰寫 Java 介面及實作來說明想要的商業邏輯。 然後,此實作會包裝到應用程式保存檔中,例如 Web 應用程式保存檔 (WAR) 或 Java 保存檔 (JAR) ,當部署 SCA 應用程式時, SCA 元件會配置包含連結的部署資訊。
最佳作法: 最佳作法是使用由上而下的方法來開發 SCA 服務實作,因為此方法會運用 XML 介面說明的功能,並在平台、連結及程式設計語言之間提供更容易的交互作業能力。 若要進一步瞭解使用由上而下方法的相關資訊,請閱讀從現有 WSDL 檔開發 SCA 服務的相關資訊。
支援的配置: 產品使用 JAXB 所定義的 XML 配置,透過可遠端介面來配置及取消配置資料。 如果您從實作的可移除 Java 介面開始,而不是從 WSDL portType 介面開始,請小心選取輸入及輸出 Java 資料類型,並確定您瞭解在 JAXB 配置和解除配置之間保留哪些資料。 不過,在本端介面上編寫實作時,您可以使用任何 Java 類型,因為本端介面使用「依參照傳遞」語意,這表示不會複製任何資料。
避免麻煩: 用來實例化透過可遠端介面複製資料的資料配置和解除配置是由 JAXB 規格所定義,而不是由 Java 序列化或 java.io.Serializable 或 java.io.Externalizable 介面所定義。 由於這種行為,某些現有的 Java 類型不適合在可遠端介面上使用,因為這些類型不會使用 Java 序列化進行序列化。 對於未註釋的資料類型,會內部檢查類別,且其 Java 內容會決定副本中所保留的資料。 對於利用 JAXB 註釋的資料類型,您可以自訂 Java 類別至 XSD 類型的對映,以及 Java 實例至 XML 文件的對映。 在此情況下,自訂 Java 序列化常式 (例如 readObject() 或 writeObject()) 不適用。 SCA 執行時期環境採用以 XML 為中心的商業資料視圖,並利用 JAXB 標準來定義 Java 程式設計模型與線上 XML 資料格式之間的對映。
程序
結果
您已從現有的 Java 介面或實作開始,使用由下而上方法來開發 SCA 服務。
範例
下列範例說明如何從現有的 Java 程式碼開始,建立可遠端 SCA 服務介面的元件實作:
- 從
myintf.NameGetter使用類型mypkg.Person的 Java 介面開始。//NameGetter.java package myintf; import mypkg.Person; public interface NameGetter { public String getName(Person p); } //Person.java package mypkg; public class Person { protected String firstName; protected String lastName; public String getFirstName() { return firstName; } public void setFirstName(String value) { this.firstName = value; } public String getLastName() { return lastName; } public void setLastName(String value) { this.lastName = value; } }在此範例中, mypkg.Person 類別非常適合在可遠端介面上使用,因為它遵循 JavaBeans 型樣,且包含其重要資料欄位的公用 getter 和 setter 配對。 執行時期環境使用的 XML 發訊格式將序列化及解除序列化此類別。 不過,其他不符合 JavaBeans 型樣的現有 Java 類型可能會造成問題,因為它們未正確序列化且發生資料流失。 因此,最佳作法是使用由上而下開發方法,從綱目定義開始,並產生 JAXB 類別以在應用程式設計模型中使用。 請參閱從現有 WSDL 檔開發 SCA 服務,以進一步瞭解由上而下開發方法。
- 因為我們是使用可遠端介面來建立服務,所以請新增 @Remotable 註釋。
//NameGetter.java package myintf; import mypkg.Person; import org.osoa.sca.annotations.Remotable; @Remotable public interface NameGetter { public String getName(Person p); } - 除非您有現有的 Java 實作,否則請撰寫所產生 Java 介面的 Java 實作,以反映您的商業邏輯。
package myintf; import mypkg.Person; public class NameGetterImpl implements NameGetter { public String getName(Person p) { // Example "business logic" return p.getFirstName() + " " + p.getLastName(); } } - 將 @Service 註釋新增至 Java 實作。
package myintf; import mypkg.Person; import org.osoa.sca.annotations.Service; @Service(NameGetter.class) public class NameGetterImpl implements NameGetter { public String getName(Person p) { // Example "business logic" return p.getFirstName() + " " + p.getLastName(); } } - 使用元件實作來建立元件。 您將在參照原始 Java 實作類別及其 Java 介面的複合中建立元件定義。 在 SCA 中,元件是元件實作的已配置實例。 這裡沒有顯示定義元件的其他方面,例如配置連結、配置內容值、定義目的、附加原則集,以及解析參照。 這裡顯示使用此範例中所開發的實作,所有元件定義共用的元件建立層面。 這個範例也包含您可以使用這個元件實作來修改或省略其他元件的連結。
<composite xmlns="https://www.osoa.org/xmlns/sca/1.0" targetNamespace="http://org.services.naming" name="NameServices"> <component name="NamingServicesComponent"> <implementation.java class="myintf.NameGetterImpl"/> <service name="NameGetter"> <!-- The interface.java is not required because the run time can introspect it. --> <interface.java interface=”myintf.NameGetter”/> <!-- The choice of bindings is not important for the example. Here, both the SCA default and web services bindings are configured. --> <binding.ws/> <binding.sca/> </service> </component> </composite> - 在元件定義為可部署組合的一部分之後 (透過使用具有組合實作的一個以上元件層直接或遞迴地) ,您已準備好透過建立 SCA 商業層次應用程式來部署 SCA 服務。