SpringMVC的GroovyTemplate视图技术能否生成JSON?
用SpringMVC + Groovy模板生成JSON(无需修改数据类)
当然可以实现!你不想改动Java数据类、把JSON序列化逻辑完全委托给视图的需求,用SpringMVC搭配Groovy模板完全能满足,甚至能做到和Grails JSON视图类似的灵活度。下面一步步教你怎么落地:
1. 引入必要依赖
首先确保项目里引入Spring MVC和Groovy模板的相关依赖(以Maven为例):
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>你的Spring版本</version> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-templates</artifactId> <version>你的Groovy版本</version> </dependency>
2. 配置Groovy模板视图解析器
在Spring配置类(或XML配置)里,配置Groovy模板的视图解析器,指定模板存放路径和后缀(我们可以用.gson作为JSON模板后缀,和Grails保持一致):
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Bean public GroovyMarkupViewResolver groovyMarkupViewResolver() { GroovyMarkupViewResolver resolver = new GroovyMarkupViewResolver(); resolver.setPrefix("/WEB-INF/groovy-templates/"); // 模板文件存放路径 resolver.setSuffix(".gson"); // 模板后缀 resolver.setContentType("application/json"); // 响应类型设为JSON resolver.setCache(false); // 开发阶段关闭缓存,生产环境可按需开启 return resolver; } }
3. 编写Groovy JSON模板
在/WEB-INF/groovy-templates/目录下创建JSON模板文件,比如user.gson。这里用Groovy的JsonBuilder完全控制JSON结构,不用碰数据类:
import groovy.json.JsonBuilder def json = new JsonBuilder() json { id user.id username user.username fullName "${user.firstName} ${user.lastName}" // 自由拼接字段 email user.email // 只输出需要的字段,忽略其他冗余属性 createdAt user.createdAt.format("yyyy-MM-dd HH:mm:ss") // 自定义日期格式 } out.print(json.toString())
如果要处理集合数据,比如批量返回用户列表,模板可以这么写:
import groovy.json.JsonBuilder def json = new JsonBuilder() json.users { users.each { u -> user { id u.id username u.username } } } out.print(json.toString())
4. 编写SpringMVC控制器
控制器里只需要把数据放入模型,返回模板名称即可,全程不用给数据类加任何Jackson注解:
@Controller @RequestMapping("/users") public class UserController { @GetMapping("/{id}") public String getUser(@PathVariable Long id, Model model) { User user = userService.getUserById(id); // 从服务层获取数据类对象 model.addAttribute("user", user); // 把数据传入模板 return "user"; // 对应user.gson模板 } }
额外实用提示
- 处理大数据量时,可以用
StreamingJsonBuilder替代JsonBuilder,减少内存占用 - 可以把通用JSON片段抽成模板片段,在多个模板里复用,提升代码维护性
- 这种方案和Grails JSON视图核心逻辑一致,完美实现“序列化逻辑从数据类剥离到视图层”的需求
内容的提问来源于stack exchange,提问作者vahidreza
相关产品推荐
相关产品推荐

