私のシステムは、Java で記述されたバックエンド部分で構成され、WSDL と XSD を使用してコントラクトファーストで定義された一連の Web サービスを公開します。Web サービスを介して転送されるデータの中には、多数の商品タイプがあります (正確には、さまざまな種類の銀行口座です)。フロントエンドは Grails Web アプリケーションです。バックエンドによってホストされるデータと操作を使用および公開します。セキュリティ上の理由から、フロントエンド自体にはデータベースがありません。すべてのデータはバックエンドに保存されます。かなり標準的なアーキテクチャ。
現在、一連の製品は大きく、成長しており、不安定です。各製品タイプは、Web アプリケーションのユーザー インターフェイスで CRUD する必要があります。プロダクト タイプの XSD 仕様をドメイン タイプとして使用し、それらのビューとコントローラを生成するように Grails に指示できれば幸いです。
大規模な実験と多くの Web ブラウジングを行った後でも、このパズルの解決策はまだ見つかっていません。私は、Grails で約 1 年分のプロとしての経験があります。ヘルプやアイデアをいただければ幸いです。
いくつかの詳細:
製品タイプは単純な 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 ソースで jaxb によって生成されたプロパティを再帰的に探し、それらの値を対応する Grails ドメイン タイプにコピーします。コンストラクターは、バックエンドからデータを取得するレイヤーから呼び出されます。
制約ブロックを使用して、必要に応じてセマンティック制約を手動で追加できます。たとえば、「from」アカウントと「to」アカウントが同じではない場合などです。
次に、このように構築されたすべての Grails ドメイン クラスのコントローラーとビューを生成し、アプリケーションを実行します。そして、例外のスタックを取得します:
Caused by MappingException: Could not determine type for: Account, at table:
product1_type, for columns: [org.hibernate.mapping.Column(from)]
ここでの問題は、Product1 の「from」および「to」プロパティが Account 型ではなく、jaxbgenerated.Account 型であることだと思います。
私はさまざまなアプローチを試みましたが、役に立ちませんでした。いくつかのメモ:
- 前述したように、すべてのデータ ストレージはバックエンドで行われるため、Grails の GORM/Hibernate の側面は必要ありません。したがって、ドメイン クラスに "static mapWith = "none" を追加しようとしましたが、役に立ちませんでした。
- 「static mapping = {from type: Account }」を追加して、Product1 のアカウントのタイプを Hibernate に明示的に伝えようとしましたが、それもうまくいきませんでした。
ヘルプやアイデアをいただければ幸いです。
/Jan Reher、Systematic A/S、デンマーク