0

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 : ''
    }
}

在此操作期间,不会发生数据库查询,因此解决方法不包括这种情况。如何使用抽象域类作为命令对象?

4

0 回答 0