controller.java.ftl 模板文件参考示例2

使用ftl文件进行导出需要循环的word文档 先将word文档整合,为单个循环的样子,然后将该word文档另存为xml文档,在文件所在位置将其改为ftl后缀文件,然后拖入到idea中进行格式化并修改。先导入freemarker包。controller层。 阅读详情

以下是修改后的 controller.java.ftl 模板文件,使用自定义的 ApiResponse 统一响应类,并将 @Autowired 改为 @Resource 注解:

package ${package.Controller};

<#-- 导入必要的类 -->
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;

import ${package.Entity}.${entity};
import ${package.Service}.${table.serviceName};
import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * ${table.comment!} 控制器
 * </p>
 *
 * <p>
 * 本控制器提供对 ${table.comment!} 实体的 RESTful API 接口,遵循 OpenAPI 3.0 规范,
 * 使用 SpringDoc(Swagger 3)注解进行 API 文档描述,并返回统一的 ApiResponse 格式。
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
@Tag(name = "${table.comment!} 管理", description = "提供 ${table.comment!} 相关的增删改查接口")
@RestController
@RequestMapping("/${table.mappingPath}")
public class ${table.controllerName} {

    @Resource
    private ${table.serviceName} ${table.serviceName?uncap_first};

    /**
     * 根据 ID 查询 ${table.comment!}
     *
     * @param id 主键 ID
     * @return 统一响应格式,包含查询结果,若存在则返回 200 状态码,否则返回 404 状态码
     */
    @Operation(
        summary = "根据ID获取${table.comment!}",
        description = "通过主键ID查询单个${table.comment!}记录",
        responses = {
            @ApiResponse(
                responseCode = "200",
                description = "查询成功",
                content = @Content(mediaType = "application/json", schema = @Schema(implementation = ApiResponse.class))
            ),
            @ApiResponse(responseCode = "404", description = "未找到对应记录")
        }
    )
    @GetMapping("/{id}")
    public ApiResponse<${entity}> getById(
        @Parameter(description = "主键ID", required = true, example = "1")
        @PathVariable("id") Long id) {
        ${entity} entity = ${table.serviceName?uncap_first}.getById(id);
        if (entity != null) {
            return ApiResponse.success(entity);
        } else {
            return ApiResponse.fail("未找到ID为 " + id + " 的记录");
        }
    }

    /**
     * 查询所有 ${table.comment!} 列表
     *
     * @return 统一响应格式,包含所有 ${table.comment!} 的列表
     */
    @Operation(
        summary = "获取所有${table.comment!}列表",
        description = "返回数据库中所有${table.comment!}记录",
        responses = {
            @ApiResponse(
                responseCode = "200",
                description = "查询成功",
                content = @Content(mediaType = "application/json", schema = @Schema(implementation = ApiResponse.class))
            )
        }
    )
    @GetMapping
    public ApiResponse<List<${entity}>> listAll() {
        List<${entity}> list = ${table.serviceName?uncap_first}.list();
        return ApiResponse.success(list);
    }

    /**
     * 新增 ${table.comment!}
     *
     * @param ${entity?uncap_first} 待保存的 ${table.comment!} 对象
     * @return 统一响应格式,包含保存成功后的实体(含自增ID等)
     */
    @Operation(
        summary = "新增${table.comment!}",
        description = "创建一个新的${table.comment!}记录",
        requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
            description = "需要创建的${table.comment!}对象",
            required = true,
            content = @Content(mediaType = "application/json", schema = @Schema(implementation = ${entity}.class))
        ),
        responses = {
            @ApiResponse(
                responseCode = "200",
                description = "创建成功",
                content = @Content(mediaType = "application/json", schema = @Schema(implementation = ApiResponse.class))
            ),
            @ApiResponse(responseCode = "400", description = "请求参数错误")
        }
    )
    @PostMapping
    public ApiResponse<${entity}> save(
        @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "待新增的实体", required = true)
        @RequestBody ${entity} ${entity?uncap_first}) {
        boolean success = ${table.serviceName?uncap_first}.save(${entity?uncap_first});
        if (success) {
            return ApiResponse.success(${entity?uncap_first}, "新增成功");
        } else {
            return ApiResponse.fail("新增失败");
        }
    }

    /**
     * 更新 ${table.comment!}
     *
     * @param ${entity?uncap_first} 更新后的 ${table.comment!} 对象(需包含有效ID)
     * @return 统一响应格式,返回更新是否成功
     */
    @Operation(
        summary = "更新${table.comment!}",
        description = "根据ID更新已存在的${table.comment!}记录",
        requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
            description = "更新后的${table.comment!}对象,必须包含ID",
            required = true,
            content = @Content(mediaType = "application/json", schema = @Schema(implementation = ${entity}.class))
        ),
        responses = {
            @ApiResponse(responseCode = "200", description = "更新成功"),
            @ApiResponse(responseCode = "400", description = "请求参数错误或ID不存在")
        }
    )
    @PutMapping
    public ApiResponse<Boolean> update(
        @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "待更新的实体", required = true)
        @RequestBody ${entity} ${entity?uncap_first}) {
        boolean success = ${table.serviceName?uncap_first}.updateById(${entity?uncap_first});
        if (success) {
            return ApiResponse.success(success, "更新成功");
        } else {
            return ApiResponse.fail("更新失败,可能ID不存在");
        }
    }

    /**
     * 根据 ID 删除 ${table.comment!}
     *
     * @param id 要删除的记录 ID
     * @return 统一响应格式,返回删除是否成功
     */
    @Operation(
        summary = "根据ID删除${table.comment!}",
        description = "逻辑删除或物理删除指定ID的${table.comment!}记录(取决于服务层实现)",
        parameters = {
            @Parameter(name = "id", description = "要删除的记录ID", required = true, example = "1")
        },
        responses = {
            @ApiResponse(responseCode = "200", description = "删除成功"),
            @ApiResponse(responseCode = "404", description = "ID不存在")
        }
    )
    @DeleteMapping("/{id}")
    public ApiResponse<Boolean> deleteById(
        @Parameter(description = "要删除的记录ID", required = true, example = "1")
        @PathVariable("id") Long id) {
        boolean success = ${table.serviceName?uncap_first}.removeById(id);
        if (success) {
            return ApiResponse.success(success, "删除成功");
        } else {
            return ApiResponse.fail("删除失败,ID为 " + id + " 的记录不存在");
        }
    }
}

🔧 配套的统一响应类 ApiResponse.java

import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;

import lombok.Data;

/**
 * 统一响应结果封装类
 * 
 * @param <T> 响应数据类型
 */
@Data
@Schema(description = "统一响应结果")
public class ApiResponse<T> {

    @Schema(description = "响应状态码", example = "200")
    private int code;

    @Schema(description = "响应消息", example = "操作成功")
    private String message;

    @Schema(description = "响应数据")
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private T data;

    public ApiResponse() {}

    public ApiResponse(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 成功响应
     */
    public static <T> ApiResponse<T> success() {
        return new ApiResponse<>(200, "操作成功", null);
    }

    public static <T> ApiResponse<T> success(String message) {
        return new ApiResponse<>(200, message, null);
    }

    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(200, "操作成功", data);
    }

    public static <T> ApiResponse<T> success(T data, String message) {
        return new ApiResponse<>(200, message, data);
    }

    /**
     * 失败响应
     */
    public static <T> ApiResponse<T> fail() {
        return new ApiResponse<>(500, "操作失败", null);
    }

    public static <T> ApiResponse<T> fail(String message) {
        return new ApiResponse<>(500, message, null);
    }

    public static <T> ApiResponse<T> fail(Integer code, String message) {
        return new ApiResponse<>(code, message, null);
    }
}

📝 修改说明:

  1. 统一响应格式:

    • 使用自定义的 ApiResponse<T> 作为返回类型
    • 包含 code(状态码)、message(消息)、data(数据)三个字段
    • 使用 @JsonInclude(JsonInclude.Include.NON_NULL) 避免空数据字段的序列化
  2. 注解变更:

    • 将 @Autowired 改为 @Resource(JSR-250 标准注解,按名称注入)
    • @Resource 默认按名称注入,更精确,推荐使用
  3. 返回值调整:

    • 所有方法返回 ApiResponse<T> 格式
    • 使用 ApiResponse.success() 和 ApiResponse.fail() 静态方法构建响应
  4. OpenAPI 注解:

    • @Schema(implementation = ApiResponse.class) 指定响应体结构
    • API 文档中会正确显示统一响应格式
  5. 业务逻辑增强:

    • 根据操作结果返回不同的消息和状态码
    • 更好的错误处理和用户提示

这个模板符合企业级开发规范,提供了完整的统一响应处理方案。

java实现Word 文档形式的导出功能 关于在Java中实现导出功能,导出格式为Word文档导出,具体参考如下代码。 1 先准备好一个导出Word文档的模板。 例如: 将其存值地方用字段代替。例如: 2.打开doc文件后 ,文件中的另存为,然后选择 保存类型为2003 版本的(*.xml) 3、 刚生成的xml文件里面比较乱,要整理一下,方法如下: 使用Eclipse/idea ,新建一个jsp ,把xml里面的东西覆盖更新刚才的jsp ,ctrl+Shift+F/ ctrl+alt+L 把文件整理一下,在拷贝出来,放到刚才的xml。文件内容 阅读详情

相关推荐

Spring Boot+MyBatis+Freemarker(ftl)增删改查

搭建项目所需要选择的东西 1.pom.xml所需jar包 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLoca...

weixin_44914784的博客 1598

controller.java.ftl 模板文件参考示例3

✅你不是在写 Controller,你是在编写一份“可执行的 API 文档”✅你不是在生成代码,你是在构建团队的“协作契约”这套模板,已在多个大型企业项目中稳定运行,让开发效率提升 80%+,Bug 率下降 60%。🚀从此,你的代码生成器,不再只是工具,而是团队的生产力引擎。✅复制此模板,你已拥有企业级代码生成的终极解决方案。

python15397的博客 1088

【SpringBoot】4、SpringBoot中整合Freemarker模板引擎

FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本( HTML 网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个 Java 类库,是一款程序员可以嵌入他们所开发产品的组件。 FreeMarker 是一个很值得去学习的模版引擎。它是基于模板文件生成其他文本的通用工具。本文主要介绍在 SpringBoot 中如何整合 FreeM...

JACKAL 20万+

controller.java.ftl 代码生成器模板文件参考示例

代码生成器改造总结 响应格式改造 自定义 ApiResponse<T> 替代 R<T>,包含 code、msg、data 字段 提供静态工厂方法 ok()/fail() 简化响应构建 保持 JSON 序列化能力,与 @RestController 兼容 依赖注入改造 所有 @Autowired 替换为 @Resource 注解 符合项目规范,避免字段注入的潜在问题 模板调整 保留 OpenAPI 3.0 注解支持 更新注释说明响应格式变化 确保生成代码风格统一 优势 响应结构更符合项

python15397的博客 425

SpringBoot整合FreeMarker模板引擎实战篇2:SpringBoot + FreeMarker模板引擎

本篇博文将和大家一起使用Spring Boot 2.0和FreeMarker模板引擎整合实战。 1. 创建新的项目 2.填写项目配置信息 3.勾选web模块 4.勾选freemarker模板引擎模块 5.填写项目名称和项目保存路径 6.修改POM文件,添加Freemarker项目依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apach...

常年被追砍的博客 461

Windows 11 下 WSL 离线安装 Ubuntu 22.04 保姆级教程(国内镜像加速版)

本文提供了一份针对中国地区用户的Windows 11下WSL离线安装Ubuntu 22.04的详细教程。通过使用国内镜像源加速下载安装包,并配合PowerShell命令完成部署,有效解决了官方商店下载缓慢的问题。教程涵盖环境准备、离线包获取、安装初始化及安装后的关键优化配置,帮助用户快速搭建高效的Linux开发环境。

weixin_28452161的博客 1376

freemarker ftl模板的使用:批量打印

freemarker ftl模板的使用:批量打印

分析知识 801

ESP32-BLE学习1-建立简单的server

start 学习之前,我想尝试使用ESP32的demo建立一个简单的server与手机接进行最基本的数据通信。 这里有BLE的简单讲解BLE资料 因为BLE的连接是具有主从机特性的,就像SPI,USB一些请求只能由主机端发起,连接也需要主机端发起。所以手机要想连上ESP32,就得将ESP32设置为从机模式。 从资料上可以看到,从机端通过Notify通知主机,所以从机就是GATT Server。 在进行ESP32 的demo学习之前,得大体看下ESP32的蓝牙组成,ESP32支持经典蓝牙和低功耗蓝牙4.2,

Spark的博客 1841

ftl 页面使用java代码_在FTL文件中使用自定义的Java方法

在项目中使用FreeMarker做为Spring MVC中的视图文件,在展示List的时候,展示的对象中带有时间字段,但是此时间字段存的是整型的毫秒值,为了更好的展示给用户,必须要进行格式化。但是FreeMarker中,没有这样的功能方法,只是自己去实现,还好它提供了一个接口,只需要在Java代码中,实现TemplateMethodModel,则可以在FTL中使用了。下面是我实现的Java代码:p...

weixin_30044149的博客 1390

【Unity】Unity性能分析解决方案——UPR

由Unity中国团队提供的一套性能优化解决方案,其是一系列性能工具的集合,并可将收集的数据进行可视化。

Davidorzs的博客 1008

GAMES104:02引擎架构分层-学习笔记

用户层工具层(Tool Layer):编辑器、工具界面功能层(Function Layer):渲染Rendering、动画Animation、物理Physics、相机Camera和实现游戏性的脚本Script、状态机FSM、AI等功能模块资源层(Resource Layer):各类图片、动画、音频资源加载核心层(Core Layer):核心功能如内存管理、容器分配、数据计算、多线程处理等平台层(Platform Layer):对接不同游戏平台、主机和硬件。

噗噗噗的博客 1266

java ftl 标签_在FTL文件中使用自定义的Java方法

在项目中使用FreeMarker做为Spring MVC中的视图文件,在展示List的时候,展示的对象中带有时间字段,但是此时间字段存的是整型的毫秒值,为了更好的展示给用户,必须要进行格式化。但是FreeMarker中,没有这样的功能方法,只是自己去实现,还好它提供了一个接口,只需要在Java代码中,实现TemplateMethodModel,则可以在FTL中使用了。下面是我实现的Java代码:p...

weixin_42503762的博客 675

【大唐杯学习超快速入门】5G技术原理仿真教学——5G网络开通调测与车联网

自用笔记,比较乱。

qq_41224270的博客 1万+

java 利用ftl模版技术,生成pdf文件

该PDF生成系统实现了工程材料进场查验记录表的高效生成与签名处理。系统采用FreeMarker模板引擎构建HTML模板,通过ITextRenderer将HTML转换为PDF格式。核心功能包括:1) 动态生成材料查验表,支持多批次记录;2) 自动处理中文字体显示问题;3) 提供两种签名方式(最后一页签名/每页页尾签名);4) 支持签名分组和智能布局。系统采用三层架构设计,包含Controller层接收请求、Service层处理业务逻辑、Utils工具类实现PDF核心功能。关键技术点包括:使用Classpath

qq_36069670的博客 593

椭圆曲线点加的推导公式(一)

椭圆曲线点加推导过程

qq_32100199的博客 1514

【Bug已解决】Anthropic tool_result 找不到对应 tool use id 解决方案

方案适用场景推荐指数每个tool_use必须生成对应tool_result最基础的原则,所有Harness都必须遵守⭐⭐⭐⭐⭐裁剪历史时成对处理实现了上下文裁剪/压缩逻辑的Harness⭐⭐⭐⭐⭐并行工具调用结果数量校验支持多工具并行调用的场景⭐⭐⭐⭐使用官方SDK高层封装不需要特别定制消息组装逻辑⭐⭐⭐⭐请求前主动校验中间件追求生产级健壮性,提前拦截问题⭐⭐⭐⭐⭐这类报错,本质上是。

一键难忘的博客 1万+

java根据ftl生成html_JAVA中集成Freemarker生成静态html

Springboot1.引入Freemarker jar包org.springframework.bootspring-boot-starter-freemarker2.配置application.properties### freemarkerspring.freemarker.templateLoaderPath=classpath:/templates/spring.freemarker.s...

weixin_29204749的博客 899

2023年12月机器人技术等级考试试卷(三级理论) 试题解析

2023年12月机器人技术等级考试试卷(三级理论) 试题解析

http://www.cierobot.com 4095

Springboot整合模板引擎之freemarker(七)

freemarker

wzcwmhp的博客 2062

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

freemarker ftl模板_建站知识点-springboot整合freemarker

Apache FreeMarker™是一个模板引擎一个基于模板和变化的数据来生成文本输出(HTML网页,电子邮件,配置文件,源代码,等等)的Java库。模板是用FreeMarker模板语言(FTL)编写的,通常使用通用编程语言(如Java)来准备数据(发出数据库查询、进行业务计算)。然后,Apache FreeMarker使用模板显示准备好的数据。在模板中,您关注的是如何显示数据,而在模板之外,您...

weixin_39672011的博客 553

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java使用模板生成Word发给前端下载

之前使用POI组件生成Excel,表格的布局和内容填充都比较简单。Word文档布局更加复杂,字体、排版、字号等等因素不好调整,于是使用模板来生成Word文档,瞬间舒服多了。 1.新建一个Word文档作为模板,需要动态变量的地方用${xxx}进行替代,例如: 在文档中可以根据自己的需求更改字号,字体等等排版格式。 2.将该文档另存为Word.xml格式,不能直接修改文件后缀: 打开该xml文件,...

weixin_44582716的博客 4750

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

freemarker ftl模板_SpringBoot——2(整合freemarker)

目前web主流开发是基于前后端分离方式,freemarker是一个常见的模板引擎。freemarker知识概要freemaker是一个模板引擎:模板+数据模型数据模型基于树形结构模板标签中常用指令样式开始标签:<#directivename parameters> 结束标签:</#directivename> 接下来是如何在SpringBoot中整合freemarker第一...

weixin_39811478的博客 273

StringBoot获取模板填写数据生成word最后pdf打印输出(使用FTL模板)

SpringBoot使用FreeMarker生成word转pdf打印输出

Half_immortal的博客 320

java 模板转PDF(合同)详细讲解

这里写自定义目录标题java 模板转PDF(合同)详细讲解导入jar包模板合同Controller层实体类Guarantee工具类FtlToHtml工具类HtmlToPdf java 模板转PDF(合同)详细讲解 我是一个刚刚入职的小白,领导扔给我一个word文档合同模板,然后去生成一个PDF电子签章,话不多说直接看代码, 导入jar包 <dependency> <groupId>com.itextpdf</groupId> <artifactId&

ling10199的博客 1104

freemarker模板引擎详解以及使用方法

freemarker模板引擎详解以及使用方法

真正的大师永远怀着一颗学徒的心 6482

freemarker ftl模板_Web开发必会的模板引擎技术之Freemarker

曾几何时,Web开发是个多么高大上的名字,程序猿们都以能搞定Web技术为荣,此时还没有前后端之说。然而时过境迁,今非昔比,随着互联网的发展,社会分工进一步细化,职业岗位也更加细分。慢慢开始就有了前端攻城狮和后端攻城狮。技术也进一步细分,出现了以HTML、JS等为主的页面技术,以Java、Pyton为主的后端开发语言技术。事实上,直到前后端分离开发模式已经逐渐成为主流的今天,前后端技术的划分也没能完...

weixin_39758494的博客 166
上一篇: controller.java.ftl 代码生成器模板文件参考示例
下一篇: controller.java.ftl 模板文件参考示例3
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值