Spring Boot与Thymeleaf实现JSON响应值动态替换的问题咨询
实现方案
1. 现有Thymeleaf方案的补全
你已经完成了Thymeleaf的模板配置,只需要调整控制器代码即可触发渲染:
- 注入你配置好的
SpringTemplateEngine实例 - 构造模板上下文传入动态变量,调用渲染方法即可
控制器代码示例:
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
相关产品推荐
相关产品推荐

