我的系统由一个用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类型。
我尝试了不同的方法但无济于事。一些说明:
任何帮助或想法都将不胜感激。
/ Jan Reher,系统A / S,丹麦