Java项目中如何引入Hutool工具类并正确使用它
作者:激流丶
1. 项目中如何引入 Hutool
1.1. import 方式引入 Hutool
如果你想像Spring-Boot一样引入Hutool,再由子模块决定用到哪些模块,你可以在父模块中加入:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-bom</artifactId>
<version>${hutool.version}</version>
<type>pom</type>
<!-- 注意这里是import -->
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在子模块中就可以引入自己需要的模块了:
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId>
</dependency>
</dependencies>
使用 import 的方式,只会引入hutool-bom内的dependencyManagement的配置,其它配置在这个引用方式下完全不起作用。
1.2. exclude 方式引入 Hutool
如果你引入的模块比较多,但是某几个模块没用,你可以:
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-bom</artifactId>
<version>${hutool.version}</version>
<!-- 加不加这句都能跑,区别只有是否告警 -->
<type>pom</type>
<exclusions>
<exclusion>
<groupId>cn.hutool</groupId>
<artifactId>hutool-system</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
这个配置会传递依赖hutool-bom内所有dependencies的内容,当前hutool-bom内的dependencies全部设置了version,就意味着在maven resolve的时候hutool-bom内就算存在dependencyManagement也不会产生任何作用。
2. 以 SpringBoot 项目为例如何使用它
在Spring Boot项目中使用Hutool,您可以按照以下步骤进行操作:
- 添加Hutool依赖:在您的项目的构建文件(如pom.xml)中添加Hutool的依赖项。您可以在Maven中添加以下依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.6</version>
</dependency>
- 在Spring Boot应用程序中使用Hutool:在您的Spring Boot应用程序中,您可以直接使用Hutool提供的工具类和方法。例如,在您的Controller类中,您可以使用Hutool的字符串工具类:
import cn.hutool.core.util.StrUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@GetMapping("/hello")
public String hello() {
String str = "Hello, Hutool!";
String reversedStr = StrUtil.reverse(str);
return reversedStr;
}
}
- 运行应用程序:启动您的Spring Boot应用程序,并访问
/hello端点,您将看到使用Hutool进行字符串翻转后的结果。
3. Hutool 的编译安装
如果想对 Hutool 的源码进行编译安装,可以访问Hutool的Gitee主页:https://gitee.com/dromara/hutool (opens new window)下载整个项目源码(v5-master或v5-dev分支都可)然后进入Hutool项目目录执行:
./hutool.sh install
然后就可以使用Maven引入了。
4. Hutool 的源码分支说明
Hutool的源码分为两个分支,功能如下:
| 分支 | 作用 |
|---|---|
| v5-master | 主分支,release版本使用的分支,与中央库提交的jar一致,不接收任何pr或修改 |
| v5-dev | 开发分支,默认为下个版本的SNAPSHOT版本,接受修改或pr |
5. 给 Hutool 提供bug反馈或建议
提交问题反馈请说明正在使用的JDK版本呢、Hutool版本和相关依赖库版本。
6. 给 Hutool 贡献代码的步骤
- 在Gitee或者Github上fork项目到自己的repo
- 把fork过去的项目也就是你的项目clone到你的本地
- 修改代码(记得一定要修改v5-dev分支)
- commit后push到自己的库(v5-dev分支)
- 登录Gitee或Github在你首页可以看到一个 pull request 按钮,点击它,填写一些说明信息,然后提交即可。
- 等待维护者合并
7. PR遵照的原则
Hutool欢迎任何人为Hutool添砖加瓦,贡献代码,不过维护者是一个强迫症患者,为了照顾病人,需要提交的pr(pull request)符合一些规范,规范如下:
- 注释完备,尤其每个新增的方法应按照Java文档规范标明方法说明、参数说明、返回值说明等信息,必要时请添加单元测试,如果愿意,也可以加上你的大名。
- Hutool的缩进按照Eclipse(不要跟我说IDEA多好用,维护者非常懒,学不会 ,IDEA真香,改了Eclipse快捷键后舒服多了)默认(tab)缩进,所以请遵守(不要和我争执空格与tab的问题,这是一个病人的习惯)。
- 新加的方法不要使用第三方库的方法,Hutool遵循无依赖原则(除非在extra模块中加方法工具)。
- 请pull request到v5-dev分支。Hutool在5.x版本后使用了新的分支:v5-master是主分支,表示已经发布中央库的版本,这个分支不允许pr,也不允许修改。
- 我们如果关闭了你的issue或pr,请不要诧异,这是我们保持问题处理整洁的一种方式,你依旧可以继续讨论,当有讨论结果时我们会重新打开。
补充:基于Hutool的excel开发
引入依赖
excel 包完全依赖于hutool 工具包,不需要额外的引入,hutool all中已经包含了hutool 的全部工具包
<!-- hutool工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.22</version>
</dependency>
开发
首先确定我们要对那些表进行数据的导入导出,这里的建议是对数据更改不频繁的表进行数据的导入导出,而且对于数据的唯一性要求不高,否则在进行数据导入的过程中,需要进行复杂的逻辑处理。这里我使用的是组织的用户信息表,该表的数据只有组织自己进行维护,就可以使用标准导入。
/**
* 组织用户信息表
* @TableName cf_group_user
*/
@TableName(value ="cf_group_user")
@Data
public class GroupUser implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 组织id
*/
private Integer groupId;
/**
* 姓名
*/
@NotBlank(message = "姓名不可为空")
private String nickname;
/**
* 性别(0:默认,1:男,2:女)
*/
@NotBlank(message = "性别不可为空")
private Integer sex;
/**
* 出生日期
*/
@NotBlank(message = "出生日期不可为空")
private Date bornTime;
/**
* 形象照片
*/
@NotBlank(message = "形象照片不可为空")
private String photo;
/**
* 家庭地址
*/
@NotBlank(message = "家庭地址不可为空")
private String homeAddress;
/**
* 联系电话
*/
@NotBlank(message = "联系电话不可为空")
private Integer mobile;
/**
* 实名信息
*/
private String authId;
/**
* 职务信息
*/
@NotNull(message = "职务不可为空")
private String post;
}
create table cf_group_user
(
id int unsigned auto_increment comment 'id'
primary key,
group_id int unsigned not null comment '组织id',
nickname char(30) not null comment '姓名',
sex tinyint unsigned not null comment '性别(1:男,2:女)',
born_time datetime not null comment '出生日期',
photo varchar(255) not null comment '形象照片',
home_address varchar(255) not null comment '家庭地址',
mobile int not null comment '联系电话',
post varchar(255) not null comment '职务信息'
)
comment '组织用户信息表' collate = utf8_unicode_ci;
create index auth_id
on cf_group_user (auth_id);
create index group_id
on cf_group_user (group_id);
create index mobile
on cf_group_user (mobile);
在确定表后,我们需要选取那些字段是我们需要使用的,在excel 表中进行展示,需要用户填入,根据字段构建反射。
实现
在工程中先确定使用的字段构建模板,根据字段构建excel 的模板。这里的示例如下:
//controller层
//返回模板
@RequestMapping("/getExcelTemplate")
public void getExcelTemplate(HttpServletResponse response) {
groupUserService.getExcelTemplate(response);
}
//sevice层
void getExcelTemplate(HttpServletResponse response);
//impl
@Override
public void getExcelTemplate(HttpServletResponse response) {
try {
// 1 读取对象
final ExcelReader reader = ExcelUtil.getReader(ResourceUtil.getStream("templates/group.xlsx"));
List<List<Object>> lists = reader.read();
ExcelWriter writer = ExcelUtil.getWriter(true);
writer.write(lists);
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("group.xlsx", "UTF-8"));
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
// 2 写出对象
ServletOutputStream outputStream = response.getOutputStream();
// 通过IO写出我们的表格对象
writer.flush(outputStream, true);
writer.close();
IoUtil.close(outputStream);
} catch (IOException e) {
log.error("EducationServiceImpl [export] 输出到响应流失败", e);
throw new APIException("导出Excel异常");
}
}
这里我使用的是三层构建,在controller 层中暴露接口,进行调用,所有的具体实现进行抽象。
//导入信息
@RequestMapping("/importStudent")
public R importStudent(@RequestParam MultipartFile file) {
try {
boolean userInfo = groupUserService.getUserInfo(file);
if(userInfo) return R.success();
} catch (IOException e) {
log.error("EducationController [getEducation] 获取输入流失败", e);
throw new APIException("获取输入流失败");
}
return R.error();
}
//导出信息
@RequestMapping("/export")
public void export(@RequestBody PageVo pageVo, HttpServletResponse response) {
groupUserService.export(pageVo, response);
}
void export(PageVo pageVo, HttpServletResponse response);
boolean getUserInfo(MultipartFile file) throws IOException;
@Override
public void export(PageVo pageVo, HttpServletResponse response) {
// 从数据库查出数据对象封装成map
final List<Map<String, Object>> educationList = this.page(new Page<>(pageVo.getPage(), pageVo.getLimit()), Wrappers.lambdaQuery()).getRecords()
.stream()
// 封装成 Map 并且放入 List
.map(item -> {
final Map<String, Object> map = new LinkedHashMap<>();
// 错误,这里需要根据表中字段名称进行命名
map.put("nickname", item.getNickname());
map.put("sex", item.getSex());
map.put("mobile", item.getMobile());
map.put("bornTime", item.getBornTime());
map.put("homeAddress", item.getHomeAddress());
map.put("post", item.getPost());
return map;
})
.collect(Collectors.toList());
// 准备将数据集合封装成Excel对象
ExcelWriter writer = ExcelUtil.getWriter(true);
// 通过工具类创建writer并且进行别名
writer.addHeaderAlias("nickname", "姓名");
writer.addHeaderAlias("sex", "性别( 0 表示男 , 1 表示 女)");
writer.addHeaderAlias("mobile", "电话");
writer.addHeaderAlias("bornTime", "出生日期");
writer.addHeaderAlias("homeAddress", "家庭地址");
writer.addHeaderAlias("post", "职位");
// 准备将对象写入我们的 List
writer.write(educationList, true);
try {
// 获取我们的输出流
final OutputStream output = response.getOutputStream();
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("group.xlsx", "UTF-8"));
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
writer.flush(output, true);
writer.close();
// 这里可以自行关闭资源或者写一个关闭资源的工具类
IoUtil.close(output);
} catch (IOException e) {
log.error("EducationServiceImpl [export] 输出到响应流失败", e);
throw new APIException("导出Excel异常");
}
}
@Override
public boolean getUserInfo(MultipartFile file) throws IOException {
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
HashMap<String, String> head = new HashMap<>(6);
head.put("姓名","nickname");
head.put("性别( 0 表示男 , 1 表示 女)","sex");
head.put("电话","mobile");
head.put("出生日期", "bornTime");
head.put("家庭地址","homeAddress");
head.put("职位","post");
reader.setHeaderAlias(head);
List<GroupUser> read = reader.read(0, 1, GroupUser.class);
Group group = groupService.getOne(new QueryWrapper<Group>().eq("uid", UserConstant.USER_ID));
for (GroupUser user : read) {
user.setGroupId(group.getId());
//TODO 默认图片
user.setPhoto("https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png");
user.setStatus(1);
user.setCreateTime(new DateTime());
if(!this.save(user))return false;
}
return true;
}
使用hutool 进行excel 处理的时候,需要自己定义字段与excel 表头见的映射关系,这一点是比较麻烦的。但相比于其他excel的使用方式,这是一种非常简单的实现。
总结
到此这篇关于Java项目中如何引入Hutool工具类并正确使用它的文章就介绍到这了,更多相关Java引入Hutool并使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
