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

Spring Boot与Thymeleaf实现JSON响应值动态替换的问题咨询

实现方案

1. 现有Thymeleaf方案的补全

你已经完成了Thymeleaf的模板配置,只需要调整控制器代码即可触发渲染:

  1. 注入你配置好的SpringTemplateEngine实例
  2. 构造模板上下文传入动态变量,调用渲染方法即可

控制器代码示例:

import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MockController {

    private final SpringTemplateEngine templateEngine;

    // 构造器注入模板引擎
    public MockController(SpringTemplateEngine templateEngine) {
        this.templateEngine = templateEngine;
    }

    @GetMapping(value = "/api", produces = MediaType.APPLICATION_JSON_VALUE)
    public String mockMethod() {
        Context context = new Context();
        // 填入动态生成的变量值
        context.setVariable("amount", 300);
        context.setVariable("orderNumber", "ORD_" + System.currentTimeMillis());
        // 参数为templates目录下的模板文件名,不需要带.json后缀(你配置了suffix自动补全)
        return templateEngine.process("sample", context);
    }
}

同时把你带占位符的JSON模板放到resources/templates/sample.json路径下即可正常运行。


2. 更轻量化的实现方案

针对你这个仅需要替换2个字段的测试场景,使用Thymeleaf确实属于过度设计,无需引入额外的模板引擎依赖和配置,以下两种零额外依赖的方案更适合:

方案一:字符串直接替换

保留你原来读取JSON文件的逻辑,直接替换占位符即可,代码改动最小:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

@RestController
public class MockController {

    @Value("classpath:/sample.json")
    private Resource sampleResource;

    @GetMapping(value = "/api", produces = "application/json")
    public String mockMethod() throws IOException {
        String templateContent = StreamUtils.copyToString(sampleResource.getInputStream(), StandardCharsets.UTF_8);
        // 动态生成你需要的字段值
        int dynamicAmount = 299;
        String dynamicOrderNo = "ORD_" + System.currentTimeMillis();
        // 直接替换占位符
        return templateContent
                .replace("${amount}", String.valueOf(dynamicAmount))
                .replace("${orderNumber}", dynamicOrderNo);
    }
}

方案二:Jackson动态修改JSON字段

不需要给JSON加占位符,直接读取原始JSON后修改对应字段即可,后续扩展修改其他字段也更灵活:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.util.Map;

@RestController
public class MockController {

    private final ObjectMapper objectMapper;
    @Value("classpath:/sample.json")
    private Resource sampleResource;

    public MockController(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @GetMapping("/api")
    public ResponseEntity<Map<String, Object>> mockMethod() throws IOException {
        // 读取原始JSON为Map结构
        Map<String, Object> result = objectMapper.readValue(sampleResource.getInputStream(), new TypeReference<Map<String, Object>>() {});
        Map<String, Object> transaction = (Map<String, Object>) result.get("transaction");
        // 覆盖需要动态生成的字段
        transaction.put("amount", 199);
        transaction.put("order_no", "ORD_" + System.currentTimeMillis());
        return ResponseEntity.ok(result);
    }
}

这两个方案都不需要额外引入依赖,代码复杂度远低于引入Thymeleaf,完全适配测试场景的轻量化需求。


内容的提问来源于stack exchange,提问作者Robert Strauch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:06:01