You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:04:29