Grails 支持域类作为开箱即用的命令对象的属性。我可以将域类Stuff
与命令一起使用StuffCommand
,但如果Stuff
是抽象类则不行。
Stuff.groovy
abstract class Stuff{
}
StuffCommand.groovy
class StuffCommand{
Stuff stuff
}
ExampleController.groovy
class ExampleController{
def doStuffWithStuff(StuffCommand stuffCmd){
render stuffCmd.stuff ? stuffCmd.stuff as JSON : ''
}
}
然后,该请求http://server:port/ctx/example/doStuffWithStuff?stuff=123
不会stuff
从我的数据库中的表中获取记录 #123。我喜欢这种方法的简洁性。对数据库的查询要么不发生,要么静默失败。
但是,以下解决方法会有所帮助:
创建一个ValueConverter
为抽象域类转换的类。类名必须以 结尾ValueConverter
,除此之外可以随意命名,例如IdStringToStuffValueConverter
。
IdStringToStuffValueConverter
import org.grails.databinding.converters.ValueConverter
class IdStringToStuffValueConverter implements ValueConverter{
@Override
boolean canConvert(Object value) {
value instanceof String || value instanceof Integer || value instanceof Long
}
@Override
Object convert(Object value) {
return Stuff.get(value.toLong())
}
@Override
Class<?> getTargetType() {
return Stuff
}
}
现在我可以触发上述请求,控制器将在数据绑定期间再次访问数据库。但是以下仍然无法按预期工作:
ExampleController.groovy
class ExampleController{
def doStuffWithStuff(Stuff stuff){
render stuff ? stuff as JSON : ''
}
}
在此操作期间,不会发生数据库查询,因此解决方法不包括这种情况。如何使用抽象域类作为命令对象?