Grails - 如何在其父类的函数中获取域实体prop的值

时间:2015-12-23 21:23:02

标签: grails gorm grails-2.0 grails-domain-class

我在一个groovy文件中有一个抽象类:

实施1

subunit_to_unit: 100

继承
public abstract class Item {
  public String testStr;

  public String getBigTestStr(){
      String s = "___" + this.testStr;
      return s;
  }
}

我们的想法是,点击材质的端点将返回class Material extends Item { public String testStr; static marshalling = { detail { includes "bigTestStr" } summary { includes "bigTestStr" } } static mapping = { table 'materialset' id column: 'NODEID' testStr column: 'MATERIALTYPE' version false } } 的返回值。但是,当我跟踪Item.bigTestStr()时,调试的变量表显示Item.bigTestStr()的值,但在将其添加到this.testStr时为null。见这里:

enter image description here

我尝试从s

中取出testStr媒体资源

实施2

Material

但我仍然遇到同样的问题。

enter image description here

对于两种实现,端点都返回

class Material extends Item {

  static marshalling = {
    detail {
        includes "bigTestStr"
    }
    summary {
        includes "bigTestStr"
    }
  }

  static mapping = {
    table   'materialset'
    id       column: 'NODEID'
    testStr  column: 'MATERIALTYPE'
    version  false
  }
}

如何获取函数在其父类中使用的{ bigTestStr: ____null } 的实际值?

更新

正如Emmanuel所指出的,实现2是使用父类属性的正确方法。但是,此实现似乎不适用于将父类的属性映射到数据库列。所以真正的问题是:如何让Material.testStr映射到数据库列?

1 个答案:

答案 0 :(得分:2)

看起来您的问题在于如何初始化Material实例。这是一个例子:

public abstract class Item {
  public String testStr

  public String getBigTestStr(){
      "___$testStr"
  }
}

class MaterialA extends Item {
  public String testStr

  static marshalling = {
    detail {
        includes 'bigTestStr'
    }
    summary {
        includes 'bigTestStr'
    }
  }

  static mapping = {
    table   'materialset'
    id       column: 'NODEID'
    testStr  column: 'MATERIALTYPE'
    version  false
  }
}

class MaterialB extends Item {

  static marshalling = {
    detail {
        includes 'bigTestStr'
    }
    summary {
        includes 'bigTestStr'
    }
  }

  static mapping = {
    table   'materialset'
    id       column: 'NODEID'
    testStr  column: 'MATERIALTYPE'
    version  false
  }
}

上面显示的是三个类ItemMaterialAMaterialB。这两个材料类模拟了您的两个测试:MaterialA具有testStr属性,而MaterialB则继承了Item中具有相同名称的属性。这是在初始化两个类的实例并测试getBigTestStr()时会发生什么:

new MaterialA(testStr: 'Hello').with {
    assert bigTestStr == '___null'
}

new MaterialB(testStr: 'Hello').with {
    assert bigTestStr == '___Hello'
}

简而言之,继承该属性的第二种方法是有效的。超类不会(也不应该)访问其子类中的任何内容。它甚至知道关于它的子类。该方法有效,因为在testStr的实例中初始化MaterialB实际上从Item初始化了继承的属性;当然可以在Item课程中访问。

在您的情况下,Grails使用存储在数据库中的值为您初始化实例。所以我会检查你的数据库。

更新

这是使用特征而不是抽象类的示例:

public trait Item {
  String testStr

  public String getBigTestStr(){
      "___$testStr"
  }
}

class Material implements Item {

  static marshalling = {
    detail {
        includes 'bigTestStr'
    }
    summary {
        includes 'bigTestStr'
    }
  }

  static mapping = {
    table   'materialset'
    id       column: 'NODEID'
    testStr  column: 'MATERIALTYPE'
    version  false
  }
}

new Material(testStr: 'Hello').with {
    assert bigTestStr == '___Hello'
}

这使得它不需要Item表。