反射式地在Grails中保存域类实例



问题如下:我想处理一个JSON体POST请求。主体由一个JSON对象数组组成,没有进一步嵌套,即简单的hashmap。所有这些对象都表示来自Android应用程序的JSON序列化的域类,它们将在我的Grails应用程序中有对应的对象。我正在考虑解析JSON主体,遍历每个元素并将每个节点保存为其相应的域类实例。

a)如何保存实例?我是Grails/Groovy的新手,所以请原谅任何巨大的错误。目前的代码是

public static Object JSONArray2Instances(String json, Class type) {
    def slurper = new JsonSlurper()
    def result = slurper.parseText(json)
    //we only want to parse JSON Arrays
    if (!(result instanceof JSONArray))
        return null
    result.each {
        def instance = it.asType(type)

        // now I need to save to domain class!
    }
}

b)我在哪里放置相应的代码?目前它在/grails-app/src/groovy中。测试结果在哪里?(因为它不是一个"真正的"Grails组件)
c)中间命令对象是否更合适?

您的代码应该进入处理请求的控制器。请看一看Gson-grails插件,其中有如何序列化和反序列化对象并将其映射到域对象的示例。请查看grails基础,其中讨论了grails应用程序和布局中使用的约定。在grails网站上有很好的例子。希望对大家有所帮助

根据来自allthenutsandbolts的评论提供的帮助,我解决了我的问题如下。:(Grails-Gson插件不需要)

N2696AdminAction为域类的名称

in my controller:

class N2696AdminActionController extends RestfulController{
    static responseFormats = ['json', 'xml']

    def JSONHandlerService

    N2696AdminActionController() {
        super(N2696AdminAction)
    }
    @Override
    @Transactional
    def save(){
        if (request!=null)
        JSONHandlerService.instancesfromJSON(request.JSON)
    }
}

那么我将持久化委托给我的服务,如下所示

类JSONHandlerService {

def instancesfromJSON(Object request){
    //we only want to parse JSON Arrays
    if (!(request instanceof JSONArray))
    return null
    request.each {
        def domainClass = Class.forName("${it.type}",

真的,Thread.currentThread () .getContextClassLoader ())

        def newDomainObject = domainClass.newInstance(it)
        newDomainObject.save(failOnError:true, flush:true, insert: true)

    }

}}

type是一个Json属性,它包含我的类的完整(包括包)名称。这样,我可以保存多个域类与相同的POST请求。

相关内容

  • 没有找到相关文章

最新更新