如何将JAXB类型用作Grails域类?

时间:2012-10-12 11:11:35

标签: grails jaxb

我的系统由一个用Java编写的后端部分组成,公开了一组Web服务,这些服务使用WSDL和XSD定义为契约优先。通过Web服务传输的数据包括大量产品类型(确切地说,它们是不同类型的银行账户)。我们的前端是Grails Web应用程序。它使用并公开后端托管的数据和操作。出于安全原因,前端本身没有数据库;所有数据都存储在后端。非常标准的架构。

现在,这套产品规模庞大,不断增长,且不稳定。每种产品类型都必须在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)]

我认为麻烦在于Product1的“from”和“to”属性不是Account类型,而是jaxbgenerated.Account类型。

我尝试了不同的方法但无济于事。一些说明:

  1. 正如我所说,所有数据存储都发生在我的后端,所以我不需要 Grails的GORM / Hibernate方面。因此我尝试添加 “static mapWith =”none“到域类,但没有 帮助。
  2. 我试着明确地告诉Hibernate账户的类型 在Product1中添加“static mapping = {from type:Account}”但是 这也没用。
  3. 任何帮助或想法都将不胜感激。

    / Jan Reher,系统A / S,丹麦

1 个答案:

答案 0 :(得分:0)

我认为你必须编写一个与此simpledb

概念相似的数据库插件