[AIX Solaris HP-UX Linux Windows]

使用現有 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 資料格式之間的對映。

程序

  1. 存取您要公開為 SCA 服務的現有 Java 介面。
  2. 判定您是使用本端介面還是可遠端介面。
    • 如果您使用可遠端介面,請將 @Remotable 註釋新增至 Java 介面。 可遠端介面上的輸入及輸出 Java 資料類型使用依值傳遞語意,這表示您的資料是使用 JAXB 所定義的 XML 序列化來複製。
  3. 完成 SCA 服務的實作。
    撰寫所產生 Java 介面的 Java 實作,以反映您的商業邏輯。 Java 實作是原始介面的「一般舊 Java 物件 (POJO)」實作。
  4. 標註 Java 實作。
    將 @Service 註釋新增至 Java 實作,以指定這是 SCA 服務。 完成此步驟時,您已建立 SCA 元件實作。
  5. 使用此元件實作在複合定義內定義元件。
    在複合的定義中,定義元件以參照回原始 Java 介面及 SCA 實作。
    1. <component> 元素下,建立 <implementation.java> 子元素,以參照 POJO 元件實作的類別名稱。
    2. <component> 元素下,建立 <service> 子元素。
    3. <service> 元素之下,建立一個參照回原始 Java 介面的 <interface.java ..> 元素。
      <service> 元素的 @name 屬性必須符合 Java 介面的不完整類別名稱。

    現在,您有一個元件具有明確定義的元件名稱,而服務名稱具有明確定義的介面。

    除了這些開發程序所說明的元件定義的這些層面之外,還有定義元件的其他層面。 這些層面包括新增連結、配置內容值、定義目的、附加原則集,以及解析參照。 您可以使用這個相同的實作來建立多個元件,但在此步驟中說明的 <implementation.java><imterface.java><service> 元素方面,所有元件定義都相同。

  6. 透過從可部署組合建立 SCA 商業層次應用程式來部署 SCA 服務。

    在前一個步驟中,您已定義在複合定義內提供 SCA 服務的元件。 此複合是可部署的複合,或遞迴地用作較高層次複合中元件的複合實作。 如果要瞭解如何部署 SCA 服務,請閱讀部署和管理商業層次應用程式的相關資訊。

結果

您已從現有的 Java 介面或實作開始,使用由下而上方法來開發 SCA 服務。

範例

下列範例說明如何從現有的 Java 程式碼開始,建立可遠端 SCA 服務介面的元件實作:
  1. 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 服務,以進一步瞭解由上而下開發方法。

  2. 因為我們是使用可遠端介面來建立服務,所以請新增 @Remotable 註釋。
    //NameGetter.java
    package myintf;
    
    import mypkg.Person;
    import org.osoa.sca.annotations.Remotable;
    
    @Remotable
    public interface NameGetter {
        public String getName(Person p);
    }
  3. 除非您有現有的 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();
        }
    
    }
  4. 將 @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();
        }
    
    }
  5. 使用元件實作來建立元件。 您將在參照原始 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>
  6. 在元件定義為可部署組合的一部分之後 (透過使用具有組合實作的一個以上元件層直接或遞迴地) ,您已準備好透過建立 SCA 商業層次應用程式來部署 SCA 服務。