[英]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.