我的系統由用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的。
我試過不同的方法,但無濟於事。一些注意事項:
- 正如我所說的,所有的數據存儲發生在我的後端,所以我不需要 的Grails的GORM /休眠方面。因此,我嘗試將 「static mapWith =」none「添加到域類中,但這並沒有幫助 。
- 我試着通過添加「靜態映射= {來自類型:帳戶}」,但 明確告訴Hibernate在產品1中帳戶 的類型,但也沒有工作。
任何幫助或想法,將不勝感激。
/月Reher,系統A/S,丹麥
謝謝;我會看看它。 –