封装Springboot基础框架功能-03
在些模块中汇总了一些web开发常用的配置和功能。
模块源码结构
Restful API常用定义
QueryParam请求参数
@Data
public class QueryParam {private String key;private String value;
}
RestfulController实现
RestfulController.java,主要汇总一些常用的restful的写法
@Slf4j
@RestController
@RequestMapping("/api/load")
public class RestfulController {/*默认 required = true*/@GetMapping("/v1/getMapping")public BaseResponse<String> getMapping( @RequestParam(value="username", required = false) String name){log.info("getMapping:{}", name);return BaseResponse.success(name);}/*这处必须用 @PathVariable 注解*/@GetMapping("/v1/pathVariable/{name}")public BaseResponse pathVariable(@PathVariable("name") String name){log.info("getMapping:{}", name);return BaseResponse.success(name);}/*默认 required = true*/@PostMapping(value = "/v1/postMapping")public BaseResponse postMapping(@RequestBody QueryParam queryParam){log.info("getMapping:{}", queryParam);return BaseResponse.success(queryParam);}@RequestMapping(value = "/v1/allRequestMapping/{name}")public BaseResponse allRequestMapping(@PathVariable("name") String name){log.info("getMapping:{}", name);return BaseResponse.success(name);}
}
RestTemplate客户端
pom.xml
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.14</version></dependency><dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.2.3</version></dependency>
RestTemplate Bean实现
配置java-ben
@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {RestTemplate restTemplate = new RestTemplate();restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));return restTemplate;}
}
application.properties配置
spring.profiles.active = dev
spring.application.name=springbootCommonConfig
server.port=17000#自定义配置服务端
service-url.service = http://www.baidu.com
调用http接口
定义一个Controller来测试Rest调用
@Slf4j
@RestController
@RequestMapping("/api/rmihttp")
public class TemplateController {@Autowiredprivate RestTemplate restTemplate;@Value("${service-url.service}")private String serviceUrl;@GetMapping("/v1/hello-content")public BaseResponse<String> loadHelloContent(String uuid){String result = restTemplate.getForObject(serviceUrl + "/s?wd=springboot", String.class, uuid);return BaseResponse.success(result);}}
RestTemplate实现GET调用
//getForObject: 返回对象为响应体中数据转化成的对象
@GetMapping("/{id}")
public Result getUser(@PathVariable Long id) {return restTemplate.getForObject(userServiceUrl + "/user/{1}", Result.class, id);
}//getForEntity: 返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等,举例如下:
@GetMapping("/getEntityByUsername")
public Result getEntityByUsername(@RequestParam String username) {ResponseEntity<Result> entity = restTemplate.getForEntity(userServiceUrl +"/user/getByUsername?username={1}", Result.class, username);if (entity.getStatusCode().is2xxSuccessful()) {return entity.getBody();} else {return new Result("操作失败", 500);}
}
RestTemplate实现POST调用
// postForObject
@PostMapping("/insert")
public Result insert(@RequestBody User user) {return restTemplate.postForObject(userServiceUrl + "/user/insert", user, Result.class);
}//postForEntity
@PostMapping("/insert")
public Result insert(@RequestBody User user) {return restTemplate.postForEntity(userServiceUrl + "/user/insert", user, Result.class).getBody();
}
Swagger-UI测试Restful API
application-dev.properties配置
以下全是自定义的属性,需要有一个相应的配置类,如下:
#swagger
springdoc.api-docs.enabled=true
springdoc.api-docs.path=/api-schemaswagger-config.group = default-group
swagger-config.description= The following is a restful-api list of {} application, and you can browse or test them to determine if they are working as you expect.
swagger-config.version=V1.0
swagger-config.urlPattern=/**
swagger-config.base-package=com.korgs
swagger-config.authorization-key-name=token
swagger-config.wiki = https://korgs.blog.csdn.net/
关键配置只有swagger-config.base-package
和swagger-config.urlPattern
,开发时最常修改的是swagger-config.base-package
用来扫描API类。如果想关闭swagger功能,可以设置springdoc.api-docs.enabled=false
。
OpenAPIConfig Bean实现
在OpenAPIConfig类中包含了一个内部类SwaggerProperties,SwaggerProperties和上述application-dev.properties
中相应的配置相对应。
@Configuration
public class OpenAPIConfig {@Autowiredprivate SwaggerProperties swaggerProperties;@Value("${spring.application.name}")private String applicationName;@Beanpublic OpenAPI openAPI() {return new OpenAPI().info(new Info().title(applicationName).description(StrUtil.format(swaggerProperties.getDescription(), applicationName)).version(swaggerProperties.getVersion())).externalDocs(new ExternalDocumentation().description("See details documentation, please click here!").url(swaggerProperties.getWiki()));}@Beanpublic GroupedOpenApi applicationRestfulApi() {return GroupedOpenApi.builder().group(swaggerProperties.getGroup()).packagesToScan(swaggerProperties.getBasePackage().split(",")).pathsToMatch(swaggerProperties.getUrlPattern()).build();}@Data@Component@ConfigurationProperties(prefix = "swagger-config")public static class SwaggerProperties{private String group;private String description;private String version;private String basePackage;private String authorizationKeyName;private String urlPattern;private String wiki;}
}
Log4j配置实现
定义一个名为log4j2.xml的文件,并在application.properties中做如下配置
# log4j
logging.config=classpath:log4j2.xml
logging.level.root=INFO
logging.level.org.springframework.web=ERROR
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?><!--scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true-->
<configuration scan="false"><!--日志文件存储路径,默认为项目根目录下,默认值为logs--><property name="LOG_PATH" value="logs"/><!-- 定义日志文件名称 --><property name="appName" value="springbootBase"></property><!--控制台日志格式定义--><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] [%level] [%c] %M %L - %msg%n</pattern></encoder></appender><!--所有日志--><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/${appName}.info.log</file><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] [%level] [%c] %M %L - %msg%n</pattern></encoder><!--按天存档日志,最多存储30天--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${LOG_PATH}/${appName}.info.%d{yyyy-MM-dd}.log.gz</FileNamePattern><MaxHistory>30</MaxHistory></rollingPolicy></appender><!--error日志--><appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><file>${LOG_PATH}/${appName}.err.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/${appName}.err.%d{yyyy-MM-dd}.log.gz</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] [%level] [%c] %M %L - %msg%n</pattern></encoder></appender><!--设置哪些日志会生效--><root level="INFO"><appender-ref ref="STDOUT"/><appender-ref ref="FILE" /><appender-ref ref="ERROR" /></root>
</configuration><!--1 %d{yyyy-MM-dd HH:mm:ss, SSS} 日志产生时间,输出到毫秒的时间-->
<!--2 %level 输出日志级别-->
<!--3 %logger 或 %c logger 的名称,通常为包名+类名-->
<!--4 %thread 或 %t 输出当前线程名称-->
<!--5 %p 日志输出格式-->
<!--6 %message 或 %msg 或 %m 日志内容,即 http://logger.info("message")-->
<!--7 %n 换行符-->
<!--8 %class 或 %C 输出 Java 类名-->
<!--9 %file 或 %F 输出文件名-->
<!--10 %L 输出错误行号-->
<!--11 %method 或 %M 输出方法名-->
<!--12 %l 输出语句所在的行数, 包括类名、方法名、文件名、行数-->
<!--13 hostName 本地机器名-->
<!--14 hostAddress 本地 ip 地址-->
线程跟踪日志
这个日志跟踪功能只能在本应用中适用,如果想在分布式环境中需要更高级的设计或是采用类似ELK之间的中间件。不过这个跟踪功能在分析问题时也非常有用。其输出格式如下:
2024-05-07 23:54:22 [http-nio-18081-exec-8] [INFO] [com.korgs.framework.logger.AccessLogInterceptor] accessLog 119 - tid=179864225215371860 appId=noSet ip=0:0:0:0:0:0:0:1 uri=/helloworld method=com.korgs.SpringbootWebApplication.helloWorld param={} inTime=1715097262676
2024-05-07 23:54:22 [http-nio-18081-exec-8] [INFO] [com.korgs.SpringbootWebApplication] helloWorld 28 - tid=179864225215371860 msg=I am busy to handle this request.
2024-05-07 23:54:22 [http-nio-18081-exec-8] [INFO] [com.korgs.framework.logger.AccessLogInterceptor] accessLog 119 - tid=179864225215371860 uri=/helloworld exec=14
- tid:随机生成的事务ID,每次请求唯一,并在同一线程内有效;
- inTime:表示接收请求的时间
- exec:表示当前请法响应的总时间
- appId:表示调用的客户端标识
- ip:表示调用的客户端IP
- uri:表示客户端调用的API
- method:表示客户端调用的API实现的java方法
源码下载
涉及模块:
- springboot-common-config:17000
源码下载:
- 基础框架源码下载
- 封装Springboot基础框架功能-03
源码运行方法:
- 模块详细功能说明和运行测试方法
相关文章:

封装Springboot基础框架功能-03
在些模块中汇总了一些web开发常用的配置和功能。 模块源码结构 Restful API常用定义 QueryParam请求参数 Data public class QueryParam {private String key;private String value; }RestfulController实现 RestfulController.java,主要汇总一些常用的restful的…...

汽车EDI:IAC Elmdon EDI 对接指南
近期收到客户C公司的需求,需要与其合作伙伴IAC Elmdon建立EDI连接,本文将主要为大家介绍IAC Elmdon EDI 对接指南,了解EDI项目的对接流程。 项目需求 传输协议:OFTP2 IAC Elmdon 与其供应商之间使用的传输协议为OFTP2。OFTP2是…...

IPFoxy:什么是静态住宅IP?静态ISP代理指南
静态住宅代理(也称为静态ISP代理)是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务?下面我具体分享。 一、什么是静态住宅代理? 首先,我…...
【算法】高精度(string实现)
模板来自:【C/string】 大数高精度运算模板 加法 string add(string a, string b) {string ans;/* 翻转两个数字字符串,使得后面的for循环从个位开始相加 */reverse(a.begin(), a.end());reverse(b.begin(), b.end());/* 初次补0,保证最高位…...

宝塔面板如何删除一个站点
我们一般的网站都是PHPMySQL开发的,所以删除站点,就要先删数据库,再删网站目录 注意:一点要确保无用的再删 删除站点目录...
Android RecyclerView
RecyclerView核心实现官方文档 Once you determine your layout, you need to implement your Adapter and ViewHolder. These two classes work together to define how your data is displayed. The ViewHolder is a wrapper around a View that contains the layout for an…...
【QT教程】QT6命令行工具开发 QT命令行
QT6命令行工具开发 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免…...

基于Springboot的微乐校园管理系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的微乐校园管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…...

【第6节课笔记】LagentAgentLego
Lagent 最中间部分的是LLM,即为大语言模型模块,他可以思考planning和调用什么action,再将其转发给动作执行器action executer执行。 支持的工具如下: Arxiv 搜索 Bing 地图 Google 学术搜索 Google 搜索 交互式 IPython 解释器 IP…...
【ARMv8/v9 系统寄存器 4 -- ARMv8 通用寄存器详细介绍】
文章目录 ARMv8 通用寄存器通用寄存器X30 寄存器和链接寄存器(LR)程序计数器(PC)ARMv8 X30和PC之间的关系小结 ARMv8 通用寄存器 在ARMv9架构中(这也适用于ARMv8,因为ARMv9是其进化版本)&#…...
一个月速刷leetcodeHOT100 day 01
两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 //哈希表做法 function twoSum(nums, target) { let obj new Map(); for (let i 0; i < nums.length; i…...

Cargo - 构建 rust项目、管理依赖包
文章目录 关于 Cargo构建项目创建工程编译运行buildclean 管理依赖添加依赖updatecheck计时 manual rust 安装可参考:https://blog.csdn.net/lovechris00/article/details/124808034 关于 Cargo Cargo 官方文档 : https://doc.rust-lang.org/cargo/crat…...

内网安全-代理Socks协议路由不出网后渗透通讯CS-MSF控制上线简单总结
我这里只记录原理,具体操作看文章后半段或者这篇文章内网渗透—代理Socks协议、路由不出网、后渗透通讯、CS-MSF控制上线_内网渗透 代理-CSDN博客 注意这里是解决后渗透通讯问题,之后怎么提权,控制后面再说 背景 只有win7有网,其…...

NSSCTF | [SWPUCTF 2021 新生赛]jicao
打开题目,发现高亮显示了一个 php 脚本 这是脚本的内容 <?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"wllm") {echo $flag;…...

Redis 支持的 Java 客户端都有哪些?
Redis 是一种高性能的键值存储系统,它以其快速、灵活和可扩展的特性而闻名。在 Java 开发中,与 Redis 交互的方式通常是通过使用 Redis 的 Java 客户端。 这些客户端提供了访问 Redis 数据库的接口,使开发人员能够在 Java 应用程序中轻松地使…...

【JavaEE 初阶(四)】多线程进阶
❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多线程知识 目录 1.前言2.常见的锁策略2.1悲观锁vs乐观锁2.2轻量级锁vs重量级锁2.3自旋锁vs挂起锁2.4读写…...

ZOC8 for Mac v8.08.1激活版:卓越性能的SSH客户端
在远程连接和管理的世界中,ZOC8 for Mac以其卓越的性能和丰富的功能,成为了众多专业人士的首选SSH客户端。它支持SSH1、SSH2、Telnet、Rlogin、Serial等多种协议,让您轻松连接到远程服务器。ZOC8拥有简洁直观的界面和强大的功能设置ÿ…...
指针(4)有点难
指针(4) 来做个简单的回顾: 指针数组: 1.是数组 2.是存放指针的数组 char* arr1[5]; int*arr2[3]; 数组指针: 1 .是指针 2 .指向数组的指针 字符指针:char*pc; 整型指针:int*pi; int …...
初步了解json文件
来自wetab 的AI pro: JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是它使用了类似于编程语言(特别是J…...
赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十)
上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(三十九)-CSDN博客 七十九、forward和redirect的区别? 在Java Web应用程序中,forward和redirect是两种不同的服务器端重定向机制,它…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...