程序猿DD Dream big, work smart, deliver fast 2023年09月04日T01:50:27.203Z https://blog.didispace.com/ 翟永超 Hexo 2.1K Star,一个帮你自动完成JavaDoc注释的IDEA插件 https://blog.didispace.com/tj-opensource-idea-javadoc/ 2023年09月03日T17:30:38.000Z 2023年09月04日T01:50:27.203Z 大家好,我是TJ!有段时间没给大家推荐好用工具了,主要是最近工作摸鱼太厉害了,所以也没去探索和接触新东西。

前几天,TJ被领导喷了,原因是代码里注释太少,导致写的SDK在生成JavaDoc文档的时候,有价值的说明内容太少,以后维护不方便。于是马上着实去优化这个是,现在是AI时代了,肯定不能死做,第一反应就是去找找看是否有直接可以用的工具。

于是,我找到了这么个IDEA插件:Easy Javadoc

大家有需要的可以直接打开IDEA,在plugins市场里搜索,就能获得。

在安装完插件之后,您只需要记住下面这些快捷键,然后就可以去代码里自动生成了:

下面跟着动图演示,来体验一下该插件快速生成JavaDoc的能力:

可以看到,它的主要功能就是根据函数名称、参数名称等代码层面的信息,通过翻译,自动生成相关的中文注释。所以,虽然有插件的辅助,但开发者还是要有良好的编码习惯,写能让人看得懂的参数定义、方法定义。这样,后续的其他自动化生成工具就都能完美的用上,来提高我们的工作效率了。

由于该插件会用到翻译功能,所以各位用户还要去选择和配置一下你需要使用的翻译API,每个供应商每月都有免费额度,对于个人来说,都足够使用了,下面是主流的一些翻译API,需要的可以自取:

好了,今天的分享就到这里,感兴趣的可以根据下面相关链接了解更多内容:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>大家好,我是TJ!有段时间没给大家推荐好用工具了,主要是最近工作摸鱼太厉害了,所以也没去探索和接触新东西。</p> <p>前几天,TJ被领导喷了,原因是代码里注释太少,导致写的SDK在生成JavaDoc文档的时候,有价值的说明内容太少,以后维护不方便。于是马上着实去优化这个
Java 21 新特性:String Templates(字符串模版) https://blog.didispace.com/java21-jep430-string-templates/ 2023年09月01日T21:07:51.000Z 2023年09月02日T06:55:36.862Z 在日常写Java的时候,对于字符串的操作是非常普遍的,其中最常见的就是对字符串的组织。也因为这个操作非常普遍,所以诞生了很多方案,总下来大概有这么几种:

  • 使用+拼接
  • 使用StringBufferSpringBuilder
  • String::format and String::formatted
  • 使用java.text.MessageFormat

下面,我们一起来学习一下Java 21中的新方案!如果您对于上面这些还不熟悉的话,建议可以先看一下这篇《Java自带的4种字符串组织和格式化方法》,了解以前的机制,这样与最新的处理方案做对比,理解会更深刻。

模版表达式

在Java 21中处理字符串的新方法称为:Template Expressions,即:模版表达式。

模版表达式是Java语言中的一种新表达式。它可以执行字符串插值,帮助开发人员通过编程的方式安全高效地组织字符串。此外,模板表达式不仅仅可以用于组织字符串,它还可以根据特定模型的规则将结构化文本转换为任何类型的对象。

下面通过一个简单的案例来认识一下它:

String blog = "blog.didispace.com";
String str = STR."My blog is \{blog}";

上述代码中的第2行就是一个模版表达式,其中主要包含三个部分:

  • 模版处理器:STR
  • 包含内嵌表达式(\{blog})的模版
  • 通过.把前面两部分组合起来,形式上类似方法调用

当模版表达式运行的时候,模版处理器会将模版内容与内嵌表达式的值组合起来,生成结果,所以上面案例中的字符串str在运行时的结果为:My blog is blog.didispace.com

多行模版表达式

还记得之前我们的Java新特性专栏中,介绍过Java 15中的文本块特性吗?类似下面这样的写法:

String html = """
<html>
<body>
<h1>Java 15 新特性:文本块 | 程序猿DD</h1>
<p>didispace.com</p>
</body>
</html>
""";

模版表达式也支持类似的多行字符串处理,所以开发者可以用它来方便的组织html、json、xml等字符串内容,比如下面这样:

var json = STR."""
{
"user": "\{name}",
"age: \{age}
}
""";

STR模版处理器

上面案例中我们所用的STR模版处理器中的内嵌表达式都采用了字符串内容,而实际上STR模版处理器还有更多的用途。

  1. 内嵌表达式中还可以之前数学运算,比如:
int x = 10, y = 20;
String s = STR."\{x} + \{y} = \{x + y}";

最终s字符串结果为:10 + 20 = 30

  1. 内嵌表达式中还可以调用方法,比如:
String s = STR."My blog is \{getMyBlog()}";

假设getMyBlog方法返回的内容为blog.didispace.com,那么最终s字符串结果为:My blog is blog.didispace.com

  1. 内嵌表达式中还可以访问对象的成员变量,比如:
User u = new User("didi", "blog.didispace.com"); // 构造函数参数为name属性和blog属性
String s = STR."\{u.name}的博客地地址为:+ \{u.blog}";

最终s字符串结果为:didi的博客地址为:blog.didispace.com

FMT模版处理器

除了STR模版处理器之外,Java中还提供了另外一个模版处理器:FMT。FMT模版处理器除了与STR模版处理器一样提供插值能力之外,还提供了左侧的格式化处理。下面通过例子来直接理解FMT的功能:

record Rectangle(String name, double width, double height) {
double area() {
return width * height;
}
}
Rectangle[] zone = new Rectangle[] {
new Rectangle("Alfa", 17.8, 31.4),
new Rectangle("Bravo", 9.6, 12.4),
new Rectangle("Charlie", 7.1, 11.23),
};
String table = STR."""
Description Width Height Area
\{zone[0].name} \{zone[0].width} \{zone[0].height} \{zone[0].area()}
\{zone[1].name} \{zone[1].width} \{zone[1].height} \{zone[1].area()}
\{zone[2].name} \{zone[2].width} \{zone[2].height} \{zone[2].area()}
Total \{zone[0].area() + zone[1].area() + zone[2].area()}
""";

上面这块是由STR模版处理器组织字符串表格数据,从模版表达式来看是非常整齐的,但是由于模版中内嵌表达式的值长短不一,最终输出结果很有可能差强人意,比如STR模版处理器处理后的结果是这样的:

Description Width Height Area
Alfa 17.8 31.4 558.92
Bravo 9.6 12.4 119.03999999999999
Charlie 7.1 11.23 79.733
Total 757.693

为了解决这个问题,就可以采用FMT模版处理器,在每一列左侧定义格式

String table = FMT."""
Description Width Height Area
%-12s\{zone[0].name} %7.2f\{zone[0].width} %7.2f\{zone[0].height} %7.2f\{zone[0].area()}
%-12s\{zone[1].name} %7.2f\{zone[1].width} %7.2f\{zone[1].height} %7.2f\{zone[1].area()}
%-12s\{zone[2].name} %7.2f\{zone[2].width} %7.2f\{zone[2].height} %7.2f\{zone[2].area()}
\{" ".repeat(28)} Total %7.2f\{zone[0].area() + zone[1].area() + zone[2].area()}
""";

这样的结果将是如下这样,获得一个整齐的结果:

Description Width Height Area
Alfa 17.80 31.40 558.92
Bravo 9.60 12.40 119.04
Charlie 7.10 11.23 79.73
Total 757.69

关于Java 21中推出的String Templates特性还有很多高级能力,比如:自定义模版处理器等。因为该特性还处于Preview阶段,所以DD也还没有深入研究,仅尝鲜了一下基本功能,如果您对其他高级能力感兴趣,也可以通过官网学习。等该功能正式发布之后,我会在 Java新特性专栏 中更新解读所有内容,欢迎关注与收藏。

]]>
<p>在日常写Java的时候,对于字符串的操作是非常普遍的,其中最常见的就是对字符串的组织。也因为这个操作非常普遍,所以诞生了很多方案,总下来大概有这么几种:</p> <ul> <li>使用<code>+</code>拼接</li> <li>使用<code>StringBuffe
14.4K Star,一款漂亮、快速、现代化的开源UI组件库 https://blog.didispace.com/tj-opensource-nextui/ 2023年08月23日T20:06:42.000Z 2023年08月24日T05:36:08.746Z 大家好,我是TJ。

之前给大家推荐了很多后台模版,有读者希望推荐一些跟通用的好看组件,毕竟出了后台还有很多其他场景嘛。所以,今天继续给大家推荐一个广受好评的UI组件库:NextUI

NextUI

主要特性

NextUI的主要目标是简化开发流程,为增强的用户体验提供美观且适应性强的系统设计。

它有以下几点核心特性:

  • 可个性定制:NextUI提供了插件的模式来定制主题,你可以更改所有的语义标记以创建一个全新的主题
  • 性能优秀:构建在TailWind CSS之上,这意味着没有运行时样式,包中也没有不必要的类,所以性能极佳
  • 日间/夜间模式:支持自动模式识别,当检测到HTML主题变化时,NextUI会自动更改主题模式
  • 快速上手:NextUI是完全组件化的,以最大限度地减少学习曲线,并提供尽可能好的开发体验

组件预览

对于一款UI组件,是否好看是大家都特别关注的,下面就带大家一起来看看NextUI的一些常用组件效果。

Avatar

Accordion

Badge

Button

Card With Image

CheckBox

Dropdown

Input

ListBox

Popover

Skeleton

Table 1

Table 2

Tabs

由于篇幅有限,就挑选了一些常用的,还有很多其他的组件没有在这里展示,感兴趣的可以自行前往官网查看并体验动态效果。

最后,老规矩,奉上相关链接,感兴趣的可以直接去深入了解:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>大家好,我是TJ。</p> <p>之前给大家推荐了很多后台模版,有读者希望推荐一些跟通用的好看组件,毕竟出了后台还有很多其他场景嘛。所以,今天继续给大家推荐一个广受好评的UI组件库:<strong>NextUI</strong></p> <p><img src="/imag
推荐一款免费好用的远程桌面:Getscreen https://blog.didispace.com/tj-freetools-getscreen/ 2023年08月17日T20:03:15.000Z 2023年08月18日T04:55:27.595Z 因为平时有多台设备要用,所以远程桌面是我经常要使用的工具。

最近,TJ君也正好看到一款不错的远程桌面软件,马上拿出来推荐给大家,如果有需要的可以看看。

今天要推荐的远程桌面软件就是这款叫Getscreen的软件,推荐理由挺简单,就3点:

  1. 简单易用:只需要两步就能轻松连上远程桌面

第一步:在需要被远程连接的机器上下载它的Agent程序并启动,点击Send获得一个链接

第二步:在其他机器上打开浏览器,使用第一步中的链接,就能轻松连上远程桌面了

使用方法是不是非常简单呢?不需要任何技术知识。

如果你有很多设备的话,还可以下载它的Dashboard来管理你的设备,使用起来会更加流畅。

  1. 个人用户基本免费

Getscreen的付费机制也比较友好,对于免费用户,可以支持2个设备,相信大部分个人用户也基本够用了。

  1. 多平台支持:支持windows、macOS、Linux以及Android

对于windows、macOS、Linux比较常规了,但是还有个Android,TJ在想是不是也能用来控制手机?这个TJ还没尝试,感兴趣的小伙伴可以试试看。

最后,老规矩,奉上相关地址;

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>因为平时有多台设备要用,所以远程桌面是我经常要使用的工具。</p> <p>最近,TJ君也正好看到一款不错的远程桌面软件,马上拿出来推荐给大家,如果有需要的可以看看。</p> <p><img src="/images2/202308/tj-freetools-getscree
Spring Boot通过企业邮箱发邮件被Gmail退回的问题解决方法 https://blog.didispace.com/spring-boot-gmail-error-550-5-7-26/ 2023年08月17日T09:07:59.000Z 2023年08月17日T17:42:57.725Z 这两天给我们开发的Chrome插件:Youtube中文配音增加了账户注册和登录功能,其中有一步是邮箱验证,所以这边会在Spring Boot后台给用户的邮箱发个验证信息。如果发邮件,之前的文章教程里就有,这里就不说了,着重说说这两天发现所有用Gmail注册的用户都被退件的问题。

报错现象

先来看看具体报错(如果您也碰到这种情况,那么可以看看后面的内容):

退信原因:发件人(youtubedubbing@mail.spring4all.com)域名的DNS记录未设置或设置错误导致对方拒收此邮件。
host gmail-smtp-in.l.google.com[142.251.10.26] said: 550-5.7.26 This mail is unauthenticated, which poses a security risk to the sender and Gmail users, and has been blocked. The sender must authenticate with at least one of SPF or DKIM. For this message, DKIM checks did not pass and SPF check for [mail.spring4all.com] did not pass with ip: [54.204.34.130]. The sender should visit https://support.google.com/mail/answer/81126#authentication for instructions on setting up authentication. k191-20020a636fc8000000b00565bcd33890si6279798pgc.848 - gsmtp (in reply to end of DATA command)
解决方案:请通知你的邮箱管理员为邮箱域名设置正确的DNS(SPF、DKIM、DMARC)记录。详细请见 http://service.exmail.qq.com/cgi-bin/help?subtype=1&&no=1000580&&id=20012

问题分析

从退信原因中Google给的链接内容非常多,大致内容就是Google针对垃圾邮件滥用邮箱等行为做的防护机制。所以,如果您要支持Gmail的话,就必须符合它所制定的身份配置要求,里面包含了:SPF配置、DKIM配置、ARC配置以及DMARC配置。

Google官方提供了一个工具:https://toolbox.googleapps.com/apps/checkmx/,可以用来检测你的一些列配置是否符合要求。您只需要输入你的邮箱域名,就可以看到如下的诊断结果:

那么多警告,显然是要慢慢解决才能不被拒收吧。。。不过那么多配置,是不是一下就晕了?

如果你懒得深入看的话,下面DD就讲一下比较快速的解决不被拒收的配置。

解决方案

不要看有那么多警告和配置内容,其实只需要把SPF配置完成,Gmail的发送就不成问题了。配置方法也很简单,就是在域名解析里加一条记录即可。

Gmail官网也给出了介绍:

但第一次也许你会跟我犯一样的错,就是直接用v=spf1 include:_spf.google.com ~all这个value了。。。其实应该要修改成你所用企业邮箱服务商的spf域名。

比如,DD这边用的是腾讯的企业邮箱,所以值要设置成:v=spf1 include:spf.mail.qq.com ~all。直观的讲,你的域名解析里需要有这样一条TXT记录:

SPF汇总

这边汇总一下,国内比较常用的企业邮箱SPF配置,如果您正好碰到类似问题,可以直接选取使用:

  • 腾讯企业邮箱:v=spf1 include:spf.mail.qq.com ~all
  • 阿里企业邮箱:v=spf1 include:spf.mxhichina.com -all
  • 网易企业邮箱:v=spf1 include:spf.163.com -all

今天的分享就到这里,希望对您有所收获!码字不易,欢迎关注、收藏、分享,支持一下。本文可以任意转载,但请注明原文链接 ^_^

]]>
<p>这两天给我们开发的Chrome插件:<a href="https://youtube-dubbing.com/" rel="external nofollow noopener noreferrer" target="_blank">Youtube中文配音</a>增加了账户
34.9K Star!超受欢迎的开源免费后台模版:tabler https://blog.didispace.com/tj-opensource-tabler/ 2023年08月14日T20:09:00.000Z 2023年08月15日T04:28:22.055Z 大家好,我是TJ

之前给大家推荐过好几款后台模版,都很受欢迎。今天继续再给大家推荐一款非常热门、广受好评的后台模版:tabler

tabler作为一款国外的开源项目,目前已经收获了34.9K Star,含金量非常高。它的主要特点总结如下:

  • 响应式布局:支持移动、平板电脑和台式机显示器,无论您使用哪种设备。Tabler在所有主流浏览器中都能很好的展示内容。
  • 跨浏览器支持:tabler与最新的Chrome、Firefox+、Safari、Opera、Edge和移动版本的浏览器都能完美兼容
  • HTML5和CSS3:采用HTML5和CSS3实现,模版中还包括了一些微妙的CSS3动画,用户体验极佳
  • 干净的代码:严格遵循Bootstrap开发标准,容易阅读,也更容易二次开发
  • 丰富的演示:模版提供了丰富的掩饰内容,各种组件提供了20多个单独的页面,让您可以自由选择和组合。所有组件的颜色和样式都可能不同,您可以使用Sass轻松进行修改。
  • 单页应用版本:tabler还有一个React版本,可以帮助你构建单页版本的应用

下面我们一起欣赏下tabler官方提供的demo:

Dashboard

Form

Button

Tables

Badges

Email Template

最后,奉上相关地址,感兴趣的可以前往了解更多:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>大家好,我是TJ</p> <p>之前给大家推荐过好几款后台模版,都很受欢迎。今天继续再给大家推荐一款非常热门、广受好评的后台模版:<strong>tabler</strong></p> <p><strong>tabler</strong>作为一款国外的开源项目,目前已经收获
10.4K Star!程序员为程序员针对性优化的开源免费笔记 https://blog.didispace.com/tj-opensource-vnote/ 2023年08月14日T04:35:34.000Z 2023年08月14日T12:46:41.864Z 大家后,我是TJ

最近身体不太舒服,好多天没写代码,也没给大家推荐好工具了。

平时我一直用Notion来记录内容为主,但也一直关注着其他开源产品。上周正好看到一款非常受欢迎的开源免费笔记,今天就推荐给大家:VNote

VNote一个由程序员为程序员打造的开源笔记应用,基于Qt开发,专注于使用 Markdown 来写作的群体。它提供完美的编辑体验和强大的笔记管理功能,使得使用Markdown记笔记更加轻松简单。VNote将来还会支持更多的文档格式。由于Qt的支持,VNote可以高效地运行在Linux、Windows和macOS平台上。

VNote的编辑可以通过下面的几张截图来初步了解:

可以看到,VNote的界面非常简洁且符合现代审美。它支持原地预览和双边预览,方便我们查看编写效果。同时,在界面左右两侧提分别提供了文件目录和文章大纲,方便作者快速切换。

对于一些复杂的UML图、流程图、数学公式也有很好的支持,具体如下:

关于文章内容的存储,是很多作者都会关注的。VNote在这方面采用了以文件形式的本地存储,一个笔记对应一个目录。所以,用户可以自由的选择第三方同步服务来备份和同步多端工作。

怎么样,VNote是你心目中想要的笔记软件吗?

最后,老规矩,奉上相关地址:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>大家后,我是TJ</p> <p>最近身体不太舒服,好多天没写代码,也没给大家推荐好工具了。</p> <p>平时我一直用Notion来记录内容为主,但也一直关注着其他开源产品。上周正好看到一款非常受欢迎的开源免费笔记,今天就推荐给大家:<strong>VNote</stron
开源免费、开箱即用的中后台管理模版:vue-pure-admin https://blog.didispace.com/tj-opensource-vue-pure-admin/ 2023年08月08日T20:09:58.000Z 2023年08月09日T04:12:51.186Z 大家好,我是TJ

之前陆陆续续给大家推荐过很多后台管理模版了,但是模版这东西永远不嫌多,所以,今天再添一枚:vue-pure-admin

vue-pure-admin采用了当下最为流线的技术栈,其中主要包括:

  • Vue3
  • Vite
  • Element-Plus
  • TypeScript
  • Pinia
  • Tailwindcss

很多热门模版一般功能都特别强大,这也导致了内容非常多,但实际很多时候我们就只要一个主体内容就可以。所以,这里值得注意的是,vue-pure-admin还提供了一个精简版本,更适合直接引入到项目作为开发初始版本。

vue-pure-admin提供的精简版打包后全局引入(包含Element-Plus的情况下)才2.3MB的大小,再利用brotli压缩之后,甚至低于350kb,可谓是极致精简了!

该模版还贴心的提供了教程视频,简直是保姆级模版了,实属难得:

接下来一起欣赏下vue-pure-admin的效果吧:

登录界面

Dashboard

流程图组件

表单设计组件

文本编辑器组件

PPT在线操作组件

这里就简单预览一下,其实还有更多有意思的组件展示,留给大家自己去探索吧!最后,奉上相关地址,喜欢的直接冲吧!

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>大家好,我是TJ</p> <p>之前陆陆续续给大家推荐过很多后台管理模版了,但是模版这东西永远不嫌多,所以,今天再添一枚:<strong>vue-pure-admin</strong></p> <p><strong>vue-pure-admin</strong>采用了当下最
Java自带的4种字符串组织和格式化方法 https://blog.didispace.com/java-string-compose-and-format/ 2023年08月07日T19:05:55.000Z 2023年08月09日T06:36:42.749Z 在Java中,组织字符串是平时最常见的操作,这里总结一下Java自带的四种处理方式。

1. 使用+拼接

案例:

String name = "DD";
String host = "blog.didispace.com";
String result = "hello " + name + ", your blog is " + host;

这种方法很容易上手,甚至可以混合使用非字符串值来一起组织。然而,结果代码编写起来非常不易阅读和维护。最大的缺点是每次我们使用+运算符时都会分配一个新的字符串。所以,JDK中还提供了多种优化策略来减少字符串的创建,比如下面的方案2。在工作中,要尽量避免使用方案1,而是下面的方案。

2. 使用StringBufferSpringBuilder

案例:

String name = "DD";
String host = "blog.didispace.com";
String result = new StringBuilder()
.append("hello ")
.append(name)
.append(", your blog is ")
.append(host)
.toString();

StringBufferStringBuilder是专门用于字符串连接的实现类,它们都提供了用于插入、替换和查找字符串的方法。但它们之间还有一定区别,StringBuffer是线程安全的,而StringBuilder则不是,所以在使用的时候要注意场景。

3. 使用String::format and String::formatted

案例:

String name = "DD";
String host = "blog.didispace.com";
String template = "hello %s, your blog is %s";
String result = format.formatter(name, host);

String类本身也提供了一些格式化方法,比如:

  • static String format(String format, Object... args)
  • static String format(Locale locale, String format, Object... args)
  • String formatted(Object... args) (Java 15+)

这些方法是以模版的方式来实现字符串的拼接,可以有效地节省字符串创建的数量。

4. 使用java.text.MessageFormat

案例:

String name = "DD";
String host = "blog.didispace.com";
String result = MessageFormat.format("hello {0}, your blog is {1}", name, host);

MessageFormat类型与上面String本身自带的format有点类似,但语法风格上有很大的差别。MessageFormat的参数风格有点像slf4j,而String自带的format风格更像C语言中的print。

除了这些JDK自带的方案之外,还有很多开发者自己封装的处理方法,后面再总结一些优秀的封装,感兴趣的记得关注下程序猿DD或者收藏我的博客。

]]>
<p>在Java中,组织字符串是平时最常见的操作,这里总结一下Java自带的四种处理方式。</p> <h2 id="1-使用-拼接"><a href="#1-使用-拼接" class="headerlink" title="1. 使用+拼接"></a>1. 使用<code>+</
开源免费的文件投喂与问答工具,构建你的第二大脑:Quivr https://blog.didispace.com/tj-opensource-quivr/ 2023年08月06日T19:29:30.000Z 2023年08月07日T15:19:47.514Z 大家后,我是TJ

利用AI帮你读文章、利用AI帮你分析非结构化数据,这些最为潮流的AI辅助工具,相信很多读者都在各种媒体上看到过了。但还是有不少人并没有真正的使用过,这里有很多原因导致,具体就不细说了,懂的都懂。

今天TJ就给大家推荐一个你可以在线使用,也可以自己搭建的AI辅助工具:Quivr。Quivr几乎可以处理任何类型的数据,包括:文本、图像、代码、音视频。采用GPT来检索和输出。以速度和效率为核心设计,确保快速访问处理您的数据并为您服务。

下面就来一起认识和体验一下它吧!

使用体验

Quivr上手非常简单,可以直接通过官网网站登录之后,上传一个你要让AI学习的文件:

上传文件

对于上传文件,目前已经支持以下文本和音视频内容:

  • Text
  • Markdown
  • PDF
  • Powerpoint
  • CSV
  • Word
  • Audio
  • Video

上传完成之后,进入聊天框,你就可以直接对AI进行提问了,Quivr会根据学习到的内容来回答您:

开始问答

对于AI的配置还可以通过右下角的设置按钮做进一步微调,比如:采用更高级的GPT-4模型:

配置微调

在线使用是不是很简单呢?

如果你还有更高的需求,比如:自己搭建的话,可以进入它的开源项目,部署自己的服务或者基于其做二次开发:

图 3

最后,奉上相关链接,感兴趣的小伙伴,赶紧冲吧!

开源地址:https://github.com/StanGirard/quivr
官网网站:https://www.quivr.app

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>大家后,我是TJ</p> <p>利用AI帮你读文章、利用AI帮你分析非结构化数据,这些最为潮流的AI辅助工具,相信很多读者都在各种媒体上看到过了。但还是有不少人并没有真正的使用过,这里有很多原因导致,具体就不细说了,懂的都懂。</p> <p>今天TJ就给大家推荐一个你可以在
内网穿透最好用的还得是ngrok,一行命令就搞定! https://blog.didispace.com/nat-traversal-ngrok/ 2023年08月05日T22:34:13.000Z 2023年08月06日T07:04:06.958Z 最近在写支付的东西,调试时候需要让支付平台能够回调本地接口来更新支付成功的状态。但由于开发机器没有公网IP,所以需要使用内网穿透来让支付平台能够成功访问到本地开发机器,这样才能更高效率的进行调试。

推荐内网穿透的文章已经很多很多,还有很多大合集的推荐,但也因为推荐的太多,也会让人眼花缭乱,不断尝试不断受挫。有的接受不了收费、有的配置繁琐,有的运行不稳定,还有的有病毒。

这里DD就不多推荐了,只推荐一个个人认为最好用的,那就是:ngrok 。只需要一行命令就能帮你轻松实现内网穿透!

下面你可以跟着我的操作来完成第一次使用:

注册登录账号

从官网(https://ngrok.com/)右上角 Sign Up 进入,完成庄户注册。如果您跟我一样是开发者的话,直接GitHub授权登录,快得很!

完成注册并登录之后,可以看到Dashboard中就给出了使用的三个步骤:

是不是超级简洁?接下来就来一起完成这三步!

安装Ngrok

进入官网的下载页面:https://ngrok.com/download

官方清晰地给出了各个系统的安装方法:

个人推荐直接下载ZIP包,然后直接解压,这种方式最为迅速!

配置账户

直接复制Dashboard中第二步的ngrok config add-authtoken xxxxx命令,然后打开终端,定位到之前解压ngrok的位置执行它!

终端会输出为你保存的配置路径,具体如下:

Authtoken saved to configuration file: /Users/zhaiyongchao/Library/Application Support/ngrok/ngrok.yml

启动ngrok

执行命令启动内网穿透:

ngrok http 8080

这里没用dashboard的80端口,因为我们写Java应用一般都是8080嘛,如果你本地的服务用了其他端口,记得修改一下就可以了。

此时,终端也变了一副画面,具体如下:

你需要关注一下其中的Forwarding内容,后面的域名就是用来通过公网访问您本地8080端口应用接口的地址了。

是不是超级方便?有没有比国内的那些换皮产品好多了?

]]>
<p>最近在写支付的东西,调试时候需要让支付平台能够回调本地接口来更新支付成功的状态。但由于开发机器没有公网IP,所以需要使用内网穿透来让支付平台能够成功访问到本地开发机器,这样才能更高效率的进行调试。</p> <p>推荐内网穿透的文章已经很多很多,还有很多大合集的推荐,但也因为
一款开源免费、更符合现代用户需求的论坛系统:vanilla https://blog.didispace.com/tj-opensource-vanilla/ 2023年08月03日T20:29:10.000Z 2023年08月04日T04:40:43.718Z 大家好,我是TJ

对于个人建站来说,WordPress相信很多读者都知道了。但WordPress很多时候我们还是用来建立自主发布内容的站点为主,适用于个人博客、企业主站等。虽然有的主题可以把WordPress变为论坛,但效果并不是很好。

所以,今天给大家推荐一个开源的论坛项目:vanilla,有建站需求的小伙伴可以关注一下!

主要特性

  • 重构了传统的论坛以迎合大众的需求。
  • 灵活的主题机制
  • 支持单点登录和嵌入式集成
  • 强大的社区管理功能
  • 插件机制,可以进一步扩展功能

下面通过图片来直观认识一下它:

论坛主页:

富文本编辑器:

Dashboard:

使用案例

vanilla的官网就是用vanilla构建的,所以感兴趣的用户可以直接通过访问官网来体验它的强大的功能:

看界面元素确实很符合现代论坛的用户需求吧。

最后,奉上相关地址,感兴趣的小伙伴可以冲了:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>大家好,我是TJ</p> <p>对于个人建站来说,WordPress相信很多读者都知道了。但WordPress很多时候我们还是用来建立自主发布内容的站点为主,适用于个人博客、企业主站等。虽然有的主题可以把WordPress变为论坛,但效果并不是很好。</p> <p>所以,今
一款极具潜力的开源免费数据库管理工具:slashbase https://blog.didispace.com/database-ide-slashbase/ 2023年08月03日T19:51:19.000Z 2023年08月04日T04:18:24.577Z 最近看到一个冷门的数据库管理工具:slashbase

这个工具是开源免费的,由于开源不久,目前才900+的Star,但用下来还是非常不错的,DD觉得这款工具还是非常有潜力的,所以给大家推荐一下。

主要特性

slashbase有几个比较亮眼的功能,比如:

  • 它提供了两种不同的管理方式,用户可以根据管理要求选择不同的方式访问数据库
    • 桌面版IDE:跟传统管理工具类似,通过桌面客户端程序的方式配置数据库连接后使用
    • 服务器版IDE:该版本类似PHPMyAdmin,可以基于浏览器来操作数据库
  • 支持图表生成,slashbase可以直接对查询结果生成直观的图表
  • 快速浏览:使用低代码UI快速过滤、排序和浏览数据和模式
  • 保存查询:编写并保存查询以便将来重新运行。有很多免费工具都不支持保存,这是非常不方便的
  • 语法手册:在IDE内搜索和查看查询命令语法,对新手非常友好,不用再百度了

除了上面的常用特性之外,slashbase还有下面这些特性:

  • AI写SQL:现在AI时代,智能生成SQL也搭配上了,用户可以编写提示以使用GPT生成SQL并运行它。
  • 控制台:像在终端中一样运行命令。
  • 项目:将所有数据库连接组织到各种项目中。
  • 数据库支持:MySQL、PostgreSQL和MongoDB

功能预览

下面一起看看slashbase的UI设计,还是非常清晰简洁的:

不知道slashbase是否入你法眼呢?最后奉上相关链接,感兴趣的小伙伴可以前往体验:

]]>
<p>最近看到一个冷门的数据库管理工具:<strong>slashbase</strong>。</p> <p>这个工具是开源免费的,由于开源不久,目前才900+的Star,但用下来还是非常不错的,DD觉得这款工具还是非常有潜力的,所以给大家推荐一下。</p> <h2 id="主要
69.9K Star,最强开源内网穿透工具:frp https://blog.didispace.com/tj-opensource-frp/ 2023年08月02日T19:52:07.000Z 2023年08月03日T04:24:25.961Z 大家好,我是TJ君

作为一名开发者,有很多场景需要用到内网穿透,比如:我们在接入一些大平台做第三方应用时,在本地开发微信公众号工具的时候需要让微信平台能否访问到本地提供的接口。除此之外,还有很多其他场景,也会用到,比如:把放在家里的NAS或服务器暴露到公网上,这样在外面的时候也可以随时随地的访问。

说到内网传统,TJ君第一个想到的是国内最早的一款知名软件:花生壳。但是今天不是要推荐它,而是要推荐一个更牛的开源项目:frp!该项目目前已经收获了69.9 K Star,在GitHub上获得了极大的认可!

下载安装

frp目前已经提供了大部分操作系统的支持版本,通过这个链接:https://github.com/fatedier/frp/releases, 就可以下载到适合你使用的安装。

图 1

以Windows的包为例,解压后可以获得这些内容:

图 2

frps是服务端程序,frpc是客户端程序。ini文件就是对应的配置文件。

暴露内网服务

内网穿透的玩法有很多,这里列举一个比较常见的例子。

比如:我要暴露一个只有自己能访问到服务器。那么可以这样配置:

配置 frps.ini,并启动服务端 frps

[common]
bind_port = 7000

在需要暴露到外网的机器上部署 frpc,配置如下:

[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh]
type = stcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22

在想要访问内网服务的机器上也部署 frpc,配置如下:

[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 绑定本地端口用于访问 SSH 服务
bind_addr = 127.0.0.1
bind_port = 6000

把frpc也都启动起来之后,通过 SSH 就可以访问内网机器了

ssh -oPort=6000 test@127.0.0.1

其他支持

除了上面的玩法之外,frp还有很多玩法,比如:

  • 自定义域名访问内网的 Web 服务
  • 转发 DNS 查询请求
  • 转发 Unix 域套接字
  • 对外提供简单的文件访问服务
  • 为本地 HTTP 服务启用 HTTPS
  • 点对点内网穿透

篇幅有限,具体如何配置这里就不多说了,有需要的读者可以直接查看官方文档,均有详细的服务端客户端配置案例。

最后,奉上相关链接:

开源地址:https://github.com/fatedier/frp/
文档地址:https://gofrp.org/docs/

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>大家好,我是TJ君</p> <p>作为一名开发者,有很多场景需要用到内网穿透,比如:我们在接入一些大平台做第三方应用时,在本地开发微信公众号工具的时候需要让微信平台能否访问到本地提供的接口。除此之外,还有很多其他场景,也会用到,比如:把放在家里的NAS或服务器暴露到公网上,
效率神器!浏览器自动化操作插件:Automa https://blog.didispace.com/tj-opensource-automa/ 2023年07月30日T09:32:17.000Z 2023年07月30日T17:48:50.435Z 相信很多小伙伴跟我一样,每天都有大量基于浏览器的重复操作,比如:查看任务、查看新闻、查看各种每天要关注的内容,甚至可能还需要对其做一些操作。那么这些任务是否有办法自动化执行呢?

今天就给大家推荐一个浏览器扩展程序:Automa。Automa是一个开源的浏览器扩展,它可以基于浏览器来执行一些自动化操作。比如,我们可以用它来自动填写表单、执行重复任务、截取网页截图以及抓取网站数据等操作。

从管理界面来直观的认识一下它:

定制工作流

可以看到Automa提供了一个直观的拖拽界面,帮助用户来定制自己的操作流程。从图中,我们可以看到Automa中包含了所有在浏览器中包含的操作。

在定义完浏览器中的工作流之后,我们还可以通过触发器来设置工作里的执行规则,比如,我们可以让他每天执行、每周执行等自定义的规则:

定制执行触发器

如果你当下还没啥灵感的话,也可以浏览一下Automa的工作流市场,这里已经有大量的可用工作流供你直接下载使用:

工作流市场

里面还有很多有趣的内容,这里TJ君就不一一列举了,感兴趣的不妨一起来探索一下吧!

最后,奉上相关地址:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>相信很多小伙伴跟我一样,每天都有大量基于浏览器的重复操作,比如:查看任务、查看新闻、查看各种每天要关注的内容,甚至可能还需要对其做一些操作。那么这些任务是否有办法自动化执行呢?</p> <p>今天就给大家推荐一个浏览器扩展程序:<strong>Automa</strong>
Notion的开源替代方案:AFFiNE https://blog.didispace.com/tj-opensource-affine/ 2023年07月23日T09:06:38.000Z 2023年07月23日T17:33:14.887Z Notion这款笔记软件相信很多开发者都比较熟悉了,很多读者,包括我自己都用它来记录和管理自己的笔记。今天给大家推荐一个最近比较火的开源替代方案:AFFiNE。目前该开源项目已经斩获20.1K Star,热度非常的高,下面一起来认识一下这个继Notion之后,被热捧的开源软件吧。

通过官方首页的介绍,我们可以知道,AFFiNE是一款集写作、绘画、计划管理与一体的软件。对标的是Notion、Miro、Monday这些热门当下热门的笔记软件。

功能特性

TJ下载了最新版本,体验了一下AFFiNE,下面几个特性可以说眼前一亮,非常好用!

  1. 简洁易上手的UI,这个不用多介绍,看界面就相信你能快速上手使用
  1. 白板和文档的超融合,你可以在你的文档笔记中,像白板一样轻松的涂涂画画
  1. 直观且强大的块级编辑

价格体系

AFFiNE同大部分热门开源软件一样,采用了社区版免费的策略。

AFFiNE对于免费用户来说提供以下支持:

  • 支持离线使用
  • 支持跨设备的点对点同步
  • 支持有限的云存储备份

对于个人用户来说,这些功能已经完全够了。而专业版、团队版和企业版主要提供一些团队协作管理所需要的能力,比如:

  • 基于AFFiNE Cloud的实时同步、协作和备份
  • 基于AI Copilot的增强创意和知识管理
  • Web发布权限管理
  • 工作空间等管理上需要的能力
  • ...

相关链接

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>Notion这款笔记软件相信很多开发者都比较熟悉了,很多读者,包括我自己都用它来记录和管理自己的笔记。今天给大家推荐一个最近比较火的开源替代方案:AFFiNE。目前该开源项目已经斩获20.1K Star,热度非常的高,下面一起来认识一下这个继Notion之后,被热捧的开源软
你的Spring Boot应用启动很慢?不妨试试这个工具! https://blog.didispace.com/spring-satrtup-analyzer/ 2023年07月22日T10:03:35.000Z 2023年07月23日T15:25:43.009Z 睡不着闲逛,在GitHub上看到一个不错的开源项目:Spring Startup Analyzer

从项目名称中就大概能猜到,这是一个分析Spring应用启动过程的工具。Spring Startup Analyzer通过采集Spring应用启动过程的数据,进而生成一个交互式的分析报告,帮助用户发现Spring应用启动慢的位置。同时,Spring Startup Analyzer还提供了Spring Bean异步初始化的工具,来帮助开发者加快Spring应用的启动时间。

下面一起来看看其提供的强大功能。

分析能力

我们可以先从该项目中给出HTML样例报告(点击这里查看)来看看它所提供的分析功能。

把报告内容的细节部分都收起来,可以看到如下图所示的内容:

主要有六个部分:

  • 启动的统计数据。其中包括:启动时间、Bean的数量、使用/总共的JAR包数量、未使用/总共的JAR包数量、ClassLoader数量
  • Spring Bean初始化数据。这里采集了每个Spring Bean的初始化时间及其细节内容
  • Bean初始化时间线。通过时间线的方式,清晰地展现了Spring应用启动时候,各个Bean的顺序关系以及时间消耗
  • 方法调用的详细信息。这里统计了每个方法的调用时间、总时间开销和每次调用的平均时间

点开之后,还能看到具体每次调用时候的时间开销和一些调用细节:

  • 启动后未使用的JAR。列出了所有Spring应用启动后没有使用的jar包,可以有效的帮助你清理不需要的依赖,为应用瘦身
  • 应用启动过程的线程火焰图

如何使用

通过上面的介绍,相信你已经了解该工具的强大之处了。接下来就可以通过下面的方法尝试分析一下自己的应用吧:

第一步:从里面的链接中下载最新的安装包

https://github.com/linyimin0812/spring-startup-analyzer/tags

第二步:解压下载的安装包,记住解压后的路径,下面一步要用

第三步:编辑Spring Boot的启动参数,包括:

  1. 该工具采用agent的方式启动,所以要添加参数-javaagent:$HOME/spring-startup-analyzer/lib/spring-profiler-agent.jar,这里$HOME代表以前的解压路径,记得根据上面解压后的路径编辑这个参数
  2. 配置分析工具的参数,这里根据自己需要添加即可,比如可以配置超时时间30分钟:-Dspring-startup-analyzer.app.health.check.timeout=30,其他可配置项如下表,你可以工具自己应用的情况去修改:

第四步:查看该工具的日志,可以通过$HOME/spring-startup-analyzer/logs路径,这里$HOME代表以前的解压路径,日志文件的类别为:

  • startup.log: 启动过程中的日志
  • transform.log: 被re-transform的类/方法信息

另外,该工具还支持自定义扩展,这里DD没试过,就不具体介绍了。感兴趣的童鞋可以根据文档去试试。

启动优化

这里提到了一个启动加速的优化思路,就是把一些耗时的Bean初始化改成异步就能实现。该项目提供了Bean的异步初始化工具,也非常好用,只需要下面几步就能完成。

第一步:引入依赖

<dependency>
<groupId>io.github.linyimin0812</groupId>
<artifactId>spring-async-bean-starter</artifactId>
<version>2.0.2</version>
</dependency>

第二步:配置参数

# 异步化的Bean可能在Spring Bean初始化顺序的末尾,导致异步优化效果不佳,打开配置优先加载异步化的Bean
spring-startup-analyzer.boost.spring.async.bean-priority-load-enable=true
# 指定异步的Bean名称
spring-startup-analyzer.boost.spring.async.bean-names=testBean,testComponent
# 执行异步化Bean初始化方法线程池的核心线程数
spring-startup-analyzer.boost.spring.async.init-bean-thread-pool-core-size=8
# 执行异步化Bean初始化方法线程池的最大线程数
spring-startup-analyzer.boost.spring.async.init-bean-thread-pool-max-size=8

第三步:检查Bean是否异步初始化。查看日志$HOME/spring-startup-analyzer/logs/startup.log文件,对于异步执行初始化的方法,会按照以下格式写一条日志:

async-init-bean, beanName: ${beanName}, async init method: ${initMethodName}

但是,作者在文档中也提到了,异步并不是万能的,你还需要注意以下这几点:

  • 应该优先从代码层面优化初始化时间长的Bean,从根本上解决Bean初始化耗时长问题
  • 对于二方包/三方包中初始化耗时长的Bean(无法进行代码优化)再考虑Bean的异步化
  • 对于不被依赖的Bean可以放心进行异步化,可以通过各个Bean加载耗时中的Root Bean判断Bean是否被其他Bean依赖
  • 对于被依赖的Bean需要小心分析,在应用启动过程中不能其他Bean被调用,否则可能会存在问题

好了,今天的学习就到这里!如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!

最后,奉上项目地址:https://github.com/linyimin0812/spring-startup-analyzer

]]>
<p>睡不着闲逛,在GitHub上看到一个不错的开源项目:<strong>Spring Startup Analyzer</strong>。</p> <p>从项目名称中就大概能猜到,这是一个分析Spring应用启动过程的工具。Spring Startup Analyzer通过采集
一款滴滴开源的流程图编辑框架:LogicFlow https://blog.didispace.com/tj-opensource-logicflow/ 2023年07月20日T11:13:29.000Z 2023年07月20日T19:16:33.464Z 最近因为要在系统里植入一个流程图的灵活绘制功能。如果说自己写一个,那必将是个庞大的工程,所以就在GitHub上调研了一番。最后发现了今天要给大家推荐的这个开源框架:LogicFlow

LogicFlow是一款流程图编辑框架,它提供了必要的流程图交互和编辑功能,同时还支持节点自定义和插件拓展。LogicFlow可以用于各种逻辑编排场景,例如流程图、ER图和BPMN流程。它在工作审批配置、机器人逻辑编排和无代码平台流程配置等方面都有广泛应用。

快速入门

LogicFlow的使用非常简单,只需要两步:

  1. 引入依赖
<!--LogicFlow core包css-->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@logicflow/core/dist/style/index.css"
/>
<!--LogicFlow extension包css-->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@logicflow/extension/lib/style/index.css"
/>
<!--LogicFlow core包js-->
<script src="https://cdn.jsdelivr.net/npm/@logicflow/core/dist/logic-flow.js"></script>
<!--LogicFlow的插件支持单个引入,这里以菜单插件为例-->
<script src="https://cdn.jsdelivr.net/npm/@logicflow/extension/lib/Menu.js"></script>

也可以使用npm引入,只需要:

npm install @logicflow/core
npm install @logicflow/extension
  1. 可以编写一个简单的案例
import LogicFlow from "@logicflow/core";
import "@logicflow/core/dist/style/index.css";

const lf = new LogicFlow({
container: document.querySelector("#container")
});

lf.render({
nodes: [
{
id: "node_id_1",
type: "rect",
x: 100,
y: 100,
text: {
x: 100,
y: 100,
value: "节点1"
},
properties: {}
},
{
id: "node_id_2",
type: "circle",
x: 200,
y: 300,
text: {
x: 200,
y: 300,
value: "节点2"
},
properties: {}
}
],
edges: [
{
id: "edge_id",
type: "polyline",
sourceNodeId: "node_id_1",
targetNodeId: "node_id_2",
text: {
x: 139,
y: 200,
value: "连线"
},
startPoint: {
x: 110,
y: 140
},
endPoint: {
x: 200,
y: 250
},
pointsList: [
{
x: 100,
y: 140
},
{
x: 100,
y: 200
},
{
x: 200,
y: 200
},
{
x: 200,
y: 250
}
],
properties: {}
}
]
});

这里不得不提一下,LogicFlow提供了一个工具,可以帮助大家所见即所得的绘图,效果如下:

工具地址:https://codesandbox.io/s/logicflow-example-1-zy3o85?file=/step1/index.js:0-1170

最后,奉上最关键的几个传送门:

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>最近因为要在系统里植入一个流程图的灵活绘制功能。如果说自己写一个,那必将是个庞大的工程,所以就在GitHub上调研了一番。最后发现了今天要给大家推荐的这个开源框架:<strong>LogicFlow</strong></p> <p><img src="/images2/20
基于Spring Boot 3的开源培训系统,学习和自用都不错 https://blog.didispace.com/tj-opensource-playedu/ 2023年07月17日T07:39:08.000Z 2023年07月17日T15:42:12.717Z 一个好企业,应该有完善的个人成长体系。每一个员工在为公司付出的时候,个人也能不断的成长。相信这是每个打工人希望遇到的,但要做好这一切并不容易。

如果您正在搭建公司的成长培训体系,那么今天的推荐也许可以助你一臂之力!

今天要推荐的开源项目名为:PlayEdu

这是一款适用于搭建内部培训平台的开源系统,旨在为企业/机构打造自己品牌的内部培训平台。

PlayEdu 基于 Java + MySQL 开发,采用前后端分离模式,前台采用 React18 为核心框架,后台采用 SpringBoot3 为核心框架。

功能体验

该开源项目提供了体验版DEMO,感兴趣的小伙伴可以直接通过下面的链接体验一下该项目的功能:

您也可以直接通过下面的截图了解一二:

学员端口界面预览

管理后台界面预览

相关链接

如果该项目对您有用,可以直接通过下面的了解更多!

欢迎扫描下方二维码,关注公众号:TJ君,订阅每日推荐,获取更多好用效率工具!

]]>
<p>一个好企业,应该有完善的个人成长体系。每一个员工在为公司付出的时候,个人也能不断的成长。相信这是每个打工人希望遇到的,但要做好这一切并不容易。</p> <p>如果您正在搭建公司的成长培训体系,那么今天的推荐也许可以助你一臂之力!</p> <p>今天要推荐的开源项目名为:<s
Spring 6.1新特性:RestClient https://blog.didispace.com/spring-6-1-restclient/ 2023年07月16日T17:01:25.000Z 2023年07月16日T17:37:40.910Z 在最近发布的Spring 6.1 M2版本中,推出了一个全新的同步HTTP客户端:RestClient。用一句话来让Spring开发者认识RestClient的话:像WebClient一样具备流畅API的RestTemplate。所以,RestClient的使命就是淘汰已经有14年历史的RestTemplate

关于WebClientRestTemplate,之前在几种服务消费方式(RestTemplate、WebClient、Feign)这篇文章中有详细的介绍。如果您有一定的了解,那么对于RestClient一定可以快速上手。

RestClient案例

下面我们通过几个官方给出的案例一起来快速的认识一下RestClient

HTTP请求

下面是一个最简单的GET请求,返回一个字符串。从这个例子中,我们可以看到API形式跟WebClient类似。不像以前用RestTemplate的时候那么麻烦。

RestClient restClient = RestClient.create();

String result = restClient.get()
.uri("https://example.com")
.retrieve()
.body(String.class);
System.out.println(result);

关于GET请求,很多时候我们返回的不仅仅是String,更多的时候是一些实体;同时我们有时候还需要获取HTTP状态码以及头信息。这个时候,我们可以使用toEntity方法来返回一个更为通用的ResponseEntity来进行后续操作,比如下面这样:

ResponseEntity<String> result = restClient.get()
.uri("https://example.com")
.retrieve()
.toEntity(String.class);

System.out.println("Response status: " + result.getStatusCode());
System.out.println("Response headers: " + result.getHeaders());
System.out.println("Contents: " + result.getBody());

在业务层面,为了更方便的解析业务数据。RestClient还支持对结果进行对象转换。比如下面的例子,就是把HTTP请求返回的JSON数据转化为Pet对象。这样就免去了开发者手动从ResponseEntity中获取内容,再进行消息转化的麻烦。

int id = ...
Pet pet = restClient.get()
.uri("https://petclinic.example.com/pets/{id}", id)
.accept(APPLICATION_JSON)
.retrieve()
.body(Pet.class);

关于其他请求,也是类似的,比如下面的POST请求:

Pet pet = ...
ResponseEntity<Void> response = restClient.post()
.uri("https://petclinic.example.com/pets/new")
.contentType(APPLICATION_JSON)
.body(pet)
.retrieve()
.toBodilessEntity();

错误处理

默认情况下,RestClient在接收到4xx和5xx状态码的时候,会抛出一个RestClientException的子类。对于这个动作,我们可以通过onStatus方法去重写它,比如下面这样:

String result = restClient.get()
.uri("https://example.com/this-url-does-not-exist")
.retrieve()
.onStatus(HttpStatusCode::is4xxClientError, (request, response) -> {
throw new MyCustomRuntimeException(response.getStatusCode(), response.getHeaders())
})
.body(String.class);

上面的例子是进一步做了包装,并重新抛出。当然您也可以做一些业务性的其他操作。

高级处理 Exchange

直接看下面的例子:

Pet result = restClient.get()
.uri("https://petclinic.example.com/pets/{id}", id)
.accept(APPLICATION_JSON)
.exchange((request, response) -> {
if (response.getStatusCode().is4xxClientError()) {
throw new MyCustomRuntimeException(response.getStatusCode(), response.getHeaders());
}
else {
Pet pet = convertResponse(response);
return pet;
}
});

exchange方法提供了更灵活且完整的请求处理入口。在这里,开发者里获取到request信息,也可以操作response信息。所以,如果您有复杂的处理逻辑上一节中的请求方法无法满足你需要的时候,就可以通过这里的exchange方法来定制复杂的处理逻辑。

小结

相信大家对RestTemplate一定都不陌生,但实际应用估计已经不是很多了,更多的会使用一些其他的客户端来实现HTTP的调用。如今Spring 6.1将推出的RestClient将很好的弥补这块不足,同时与WebClient互相补充。

好了,今天的学习就到这里!如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!

]]>
<p>在最近发布的Spring 6.1 M2版本中,推出了一个全新的同步HTTP客户端:<code>RestClient</code>。用一句话来让Spring开发者认识<code>RestClient</code>的话:像<code>WebClient</code>一样具备流畅

AltStyle によって変換されたページ (->オリジナル) /