2012-10-12 67 views
2

我的系統由用Java編寫的後端部分組成,公開了一組使用WSDL和XSD定義合同優先級的Web服務。通過Web服務傳輸的數據中有大量的產品類型(準確而言,它們是不同種類的銀行賬戶)。我們的前端是一個Grails Web應用程序。它使用並公開由後端託管的數據和操作。由於安全原因,前端沒有自己的數據庫;所有數據都存儲在後端。漂亮的標準架構。如何使用JAXB類型作爲Grails域類?

現在,這套產品是龐大的,不斷增長的和不穩定的。每種產品類型都必須在Web應用程序用戶界面上進行CRUD編輯。如果我能告訴Grails將產品類型的XSD規範用作域類型,併爲它們生成視圖和控制器,那將是可愛的。

我還沒有找到這個謎題的解決方案,即使經過大量的實驗和大量的網頁瀏覽。我有大約一年的Grails專業經驗。任何幫助或想法,將不勝感激。

一些細節:

一種產品類型是一個簡單的POJO數據載體。一些簡化示例:

package jaxbgenerated; 

public class Product1 { 
    protected Account from; 
    protected Account to; 
    protected String name; 
    // + getters and setters 
} 

public class Product2 { 
    protected List<Account> accounts; 
    protected String name; 
    // + getters and setters 
} 

public class Account { 
    protected String id1; 
    protected String id2; 
    // + getters and setters 
} 

請注意,「帳戶」不是產品類型,但它是JAXB生成的類型。除了像String,int和Date這樣的簡單數據類型的屬性之外,產品還可以包含這些屬性,但它們從不包含其他產品類型。

我打算的最終結果是Grails生成的表單,用戶可以使用嵌套表單編輯Product1實例,以編輯其組成帳戶。同樣適用於Product2。

我的想法是每個JAXB生成的類型,首先手工編碼一個Grails域類:

//in grails-app/domain: 
  
import utilities.Copier 
  
class Product1 extends jaxbgenerated.Product1 { 
    Product1(jaxbgenerated.Product1 jaxb) { 
     Copier.copy(jaxb, this) 
    } 

    static constraints = { 
    } 
} 

有一點的樣板代碼在這裏,但沒有什麼比我可以住在一起。 Copier.copy()函數(我認爲)需要將從後端獲取的jaxbegenerated.Product實例轉換爲可在Grails中使用的Product1實例。它遞歸地在jaxb源文件中查找jaxbgenerated屬性,並將它們的值複製到對應的Grails域類型中。構造函數是從一個從後端獲取數據的層調用的。

我可以使用約束塊在需要的地方手動添加語義約束,例如, 「從」和「到」帳戶是不一樣的。

接下來,我爲這樣構造的所有Grails域類生成控制器和視圖,並運行該應用程序。並得到例外的堆棧:

Caused by MappingException: Could not determine type for: Account, at table: 
product1_type, for columns: [org.hibernate.mapping.Column(from)] 

我覺得這裏的問題是,產品1的「從」和「到」的屬性的類型不是帳戶,但類型jaxbgenerated.Account的。

我試過不同的方法,但無濟於事。一些注意事項:

  1. 正如我所說的,所有的數據存儲發生在我的後端,所以我不需要 的Grails的GORM /休眠方面。因此,我嘗試將 「static mapWith =」none「添加到域類中,但這並沒有幫助 。
  2. 我試着通過添加「靜態映射= {來自類型:帳戶}」,但 明確告訴Hibernate在產品1中帳戶 的類型,但也沒有工作。

任何幫助或想法,將不勝感激。

/月Reher,系統A/S,丹麥

回答

0

我覺得你有做寫dababase插件在概念上類似於此simpledb

+0

謝謝;我會看看它。 –