繁体   English   中英

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

[英]Reflectively save domain class instances in Grails

问题如下:我想处理带有JSON正文的POST请求。 该主体由一个JSON对象数组组成,没有进一步的嵌套,即简单的HashMaps。 所有这些对象代表来自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为域类的名称

在我的控制器中:

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}", 

true,Thread.currentThread()。getContextClassLoader())

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

}}

type是一个Json属性,其中包含我的类的全名(包括包在内)。 这样,我可以使用相同的POST请求保存到多个域类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM