json - 使用 Hibernate-GORM 时,如何将域类转换为 JSON 字符串?
问题描述
为了在 Micronaut 1.1.1 中使用 Hibernate-GORM,我使用以下命令创建一个 micronaut 应用程序:
mn create-app foo -l=groovy -f=hibernate-gorm
而且,为了增加接近 JSON 的能力,我在 build.gradle 中添加了以下行,以便使用 JsonSlurper 接近 JSON:
compile 'org.codehaus.groovy:groovy-all:2.5.6'
所以我的 build.grade 如下所示:
plugins {
id "io.spring.dependency-management" version "1.0.6.RELEASE"
id "groovy"
id "com.github.johnrengelman.shadow" version "4.0.2"
id "application"
}
version "0.1"
group "memberservice"
repositories {
mavenCentral()
maven { url "https://jcenter.bintray.com" }
}
dependencyManagement {
imports {
mavenBom 'io.micronaut:micronaut-bom:1.1.1'
}
}
configurations {
// for dependencies that are needed for development only
developmentOnly
}
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.5.6'
compile "io.micronaut:micronaut-runtime-groovy"
compile "io.micronaut:micronaut-validation"
compile "io.micronaut:micronaut-http-client"
compile "io.micronaut.configuration:micronaut-hibernate-validator"
compile "io.micronaut.configuration:micronaut-hibernate-gorm"
compile "io.micronaut:micronaut-http-server-netty"
compileOnly "io.micronaut:micronaut-inject-groovy"
runtime "ch.qos.logback:logback-classic:1.2.3"
runtime "com.h2database:h2"
runtime "org.apache.tomcat:tomcat-jdbc"
testCompile("org.spockframework:spock-core") {
exclude group: "org.codehaus.groovy", module: "groovy-all"
}
testCompile "io.micronaut:micronaut-inject-groovy"
testCompile "io.micronaut.test:micronaut-test-spock"
}
test.classpath += configurations.developmentOnly
mainClassName = "memberservice.Application"
tasks.withType(GroovyCompile) {
groovyOptions.forkOptions.jvmArgs.add('-Dgroovy.parameters=true')
}
shadowJar {
mergeServiceFiles()
}
run.classpath += configurations.developmentOnly
run.jvmArgs('-noverify', '-XX:TieredStopAtLevel=1', '-Dcom.sun.management.jmxremote')
现在我有一个域类如下:
import grails.gorm.annotation.Entity
@Entity
class Member {
String memberId
String email
static constraints = {
memberId maxSize: 20, nullable: false, unique: true
email maxSize: 60, nullable: false
}
}
我有一个控制器如下:
import groovy.json.JsonBuilder
import groovy.util.logging.Slf4j
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import memberservice.domain.Member
@Slf4j
@Controller('/member')
class MemberController {
@Get('/testFetchMember')
def testFetchMember() {
Member member
Member.withTransaction {
member = Member.findByMemberId('A0001')
}
log.info("member.email is ${member.email}")
def jsonObject = new JsonBuilder(member)
log.info("check point 1001: finish JsonBuilder")
String jsonString = jsonObject.toPrettyString()
log.info("jsonString=" + jsonString)
return jsonString
}
@Get('/buildSampleData')
def buildSampleData() {
Member member = new Member()
member.with {
memberId = 'A0001'
email = 'foo@gmail.com'
}
Member.withTransaction {
member.save()
// new Member(memberId: 'A0002', 'foo1@mail.com').save()
// new Member(memberId: 'A0003', 'foo2@mail.com').save()
}
return "Sample data built done"
}
}
以下是输出日志:
09:23:30.610 [pool-2-thread-1] INFO m.controller.MemberController - member.email is foo@gmail.com
09:23:30.619 [pool-2-thread-1] INFO m.controller.MemberController - check point 1001: finish JsonBuilder
09:23:31.069 [pool-2-thread-1] ERROR i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: null
java.lang.StackOverflowError: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaBeanProperty.getProperty(MetaBeanProperty.java:59)
at groovy.lang.PropertyValue.getValue(PropertyValue.java:42)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.getProperties(DefaultGroovyMethods.java:557)
at groovy.json.DefaultJsonGenerator.getObjectProperties(DefaultJsonGenerator.java:242)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:236)
at groovy.json.DefaultJsonGenerator.writeMapEntry(DefaultJsonGenerator.java:387)
at groovy.json.DefaultJsonGenerator.writeMap(DefaultJsonGenerator.java:375)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:237)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:164)
at groovy.json.DefaultJsonGenerator.writeIterator(DefaultJsonGenerator.java:402)
at groovy.json.DefaultJsonGenerator.writeArray(DefaultJsonGenerator.java:285)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:221)
at groovy.json.DefaultJsonGenerator.writeMapEntry(DefaultJsonGenerator.java:387)
at groovy.json.DefaultJsonGenerator.writeMap(DefaultJsonGenerator.java:375)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:237)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:164)
at groovy.json.DefaultJsonGenerator.writeIterator(DefaultJsonGenerator.java:402)
at groovy.json.DefaultJsonGenerator.writeArray(DefaultJsonGenerator.java:285)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:221)
at groovy.json.DefaultJsonGenerator.writeMapEntry(DefaultJsonGenerator.java:387)
at groovy.json.DefaultJsonGenerator.writeMap(DefaultJsonGenerator.java:375)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:237)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:164)
at groovy.json.DefaultJsonGenerator.writeIterator(DefaultJsonGenerator.java:402)
at groovy.json.DefaultJsonGenerator.writeArray(DefaultJsonGenerator.java:285)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:221)
at groovy.json.DefaultJsonGenerator.writeMapEntry(DefaultJsonGenerator.java:387)
at groovy.json.DefaultJsonGenerator.writeMap(DefaultJsonGenerator.java:375)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:237)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:164)
at groovy.json.DefaultJsonGenerator.writeIterator(DefaultJsonGenerator.java:402)
at groovy.json.DefaultJsonGenerator.writeArray(DefaultJsonGenerator.java:285)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:221)
at groovy.json.DefaultJsonGenerator.writeMapEntry(DefaultJsonGenerator.java:387)
at groovy.json.DefaultJsonGenerator.writeMap(DefaultJsonGenerator.java:375)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:237)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:164)
at groovy.json.DefaultJsonGenerator.writeIterator(DefaultJsonGenerator.java:402)
at groovy.json.DefaultJsonGenerator.writeArray(DefaultJsonGenerator.java:285)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:221)
at groovy.json.DefaultJsonGenerator.writeMapEntry(DefaultJsonGenerator.java:387)
at groovy.json.DefaultJsonGenerator.writeMap(DefaultJsonGenerator.java:375)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:237)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:164)
at groovy.json.DefaultJsonGenerator.writeIterator(DefaultJsonGenerator.java:402)
at groovy.json.DefaultJsonGenerator.writeArray(DefaultJsonGenerator.java:285)
.....
.....
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:221)
at groovy.json.DefaultJsonGenerator.writeMapEntry(DefaultJsonGenerator.java:387)
at groovy.json.DefaultJsonGenerator.writeMap(DefaultJsonGenerator.java:375)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:237)
at groovy.json.DefaultJsonGenerator.writeObject(DefaultJsonGenerator.java:164)
at groovy.json.DefaultJsonGenerator.writeIterator(DefaultJsonGenerator.java:402)
at groovy.json.DefaultJsonGenerator.writeArray(DefaultJsonGenerator.java:285)
似乎 JsonSlurper 和 JsonBuilder 都无法处理从 GORM 构建的域类。
那么,有没有什么优雅的方法可以在 Micronaut 中将域类转换为 JSON 字符串?请不要让我使用Jackson库,因为Jackson的方法非常紧迫。
我知道在 Grails 中,转换器 JSON 可以毫无问题地将域类转换为 JSON 字符串。那么,是否可以像 Grails 一样将 JSON 转换器的功能添加到 Micronaut 中?
解决方案
而不是这个...
@Controller('/member')
class MemberController {
@Get('/testFetchMember')
def testFetchMember() {
Member member
Member.withTransaction {
member = Member.findByMemberId('A0001')
}
log.info("member.email is ${member.email}")
def jsonObject = new JsonBuilder(member)
log.info("check point 1001: finish JsonBuilder")
String jsonString = jsonObject.toPrettyString()
log.info("jsonString=" + jsonString)
return jsonString
}
}
你可以这样做...
@Controller('/member')
class MemberController {
@Get('/testFetchMember')
Member testFetchMember() {
Member member
Member.withTransaction {
member = Member.findByMemberId('A0001')
}
log.info("member.email is ${member.email}")
member
}
}
如果您的控制器操作返回 POJO/POGO/等,它将使用 Jackson 序列化为 JSON。
仅供参考...我不会.withTransaction
在控制器操作中做这些事情,但这与提出的问题无关。
推荐阅读
- javascript - 仅在桌面重新加载页面后,Bootstrap 4 折叠保存
- audio - 在输出中包含来自 FFmpeg 覆盖的音频
- python - 富文本字段未返回所需的输出
- asp.net-core - razorpages 可以在 pagemodel 旁边有一个通用的基类吗?
- php - CRUD 操作编辑按钮链接错误参数 2 传递数组给定错误
- c# - 在 C# 中使用 linq 从 SQL Server 数据库中获取日期值
- java - 用角度画线
- c++ - 使用新线程分配正在运行的线程是否安全?
- android - 应用程序如何知道设备已经安装了该应用程序并将其从推荐奖金中消除?
- opencv - 将图像分类到文件夹时出现错误,无法获取设备属性,错误代码:30 Keras