Java Stream 排序与 Comparator 的空指针处理,以及 IDEA 调试里 null 不显示的坑
记录一次排序 NPE 的排查和解决,顺便说下 IDEA 调试集合时 null 元素不显示的问题怎么调整。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-07-07 16:15:43 MinIO Java 预签名URL
对象存储里,要想临时给别人一个文件访问链接,又不希望直接把访问密钥发出去,预签名URL就是个很常用的手段。MinIO Java SDK 提供了 getPresignedObjectUrl 方法,可以生成带时效签名的 URL,客户端在有效期内就能直接操作私有桶里的对象。
基本用法不复杂。先初始化一个 MinioClient,配好 endpoint 和 access key / secret key。然后调用 getPresignedObjectUrl,通过 builder 把参数传进去。需要的东西有这几个:bucket 名称、对象路径(比如 folder/image.jpg)、操作类型,以及有效期。
操作类型用 Method.GET 就是生成下载链接,Method.PUT 就是上传链接。有效期可以传一个整数加 TimeUnit,比如 1 小时就是 expiry(1, TimeUnit.HOURS)。
一个完整的下载链接示例大概这样:
MinioClient minioClient = MinioClient.builder()
.endpoint("http://192.168.202.1:9000")
.credentials("minioadmin", "minioadmin")
.build();
String url = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.bucket("my-bucket")
.object("test/file.txt")
.method(Method.GET)
.expiry(1, TimeUnit.HOURS)
.build()
);
System.out.println("预签名URL: " + url);
异常那一块也别漏了,需要捕获 InvalidKeyException、NoSuchAlgorithmException 等,实际写的时候可以兜底 catch Exception 统一处理,示例里就是那么干的。
如果是要生成上传用的预签名 URL,把 method 改成 Method.PUT 就行,其他几乎一样:
String uploadUrl = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.bucket("my-bucket")
.object("uploads/file.txt")
.method(Method.PUT)
.expiry(10, TimeUnit.MINUTES)
.build()
);
这里有几个经验。有效期别随手设太长,一般几分钟到一两个小时足够。长期有效的 URL 放出去就是安全隐患,就算签名能防篡改,但一旦泄露在有效期内别人也能随便用。
时效设置可以用 TimeUnit,灵活度还行。我一般下载链接给 30 分钟,上传可能给 10 分钟,具体看业务能接受多久的等待。
权限方面,生成 PUT 预签名 URL 不代表客户端就能直接上传成功,MinIO 的桶策略默认可能不允许匿名上传,即使签了名也可能被拒。要么调整桶的访问策略,允许 PutObject;要么干脆把桶设成公开写,但那样就没必要用预签名了。通常的做法是单独给这个桶配上允许 PutObject 的 policy,然后靠预签名控制有效期和对象路径。
SDK 版本尽量用新的,至少 8.5.9 以上,老版本有些坑和 bug。Maven 依赖这样加:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.9</version>
</dependency>
线上如果遇到生成的 URL 访问不了,排查顺序一般是:先用 bucketExists 确认桶在不在,再看看对象路径是不是多了或者少了斜杠,最后可以试试把有效期调短重新生成。极少数情况下签名算法会因为客户端时间不同步出问题,不过那种情况报错会比较明显。
有时候刚入门会以为预签名 URL 能绕过所有权限检查,其实它只是把签名动作前置了,底层鉴权逻辑没变。比如桶不存在的错误跟有没有签名无关,直接报 404。
这点搞明白能少走点弯路。
这样整下来,SDK 生成预签名 URL 的代码量不大,基本就是构建参数、调方法、拿结果,剩下的都是周边注意事项。总之能用就行。
记录一次排序 NPE 的排查和解决,顺便说下 IDEA 调试集合时 null 元素不显示的问题怎么调整。
跑单测突然报 Command line is too long,大多数情况在 Run Configuration 里勾一个选项就完事。这里把原因和几种方案一起记一下。
想象一下从精确到极致的BigDecimal世界踏入“四舍五入”的Double领域。本文揭示Java数值转换的奥秘,解析精度损失的陷阱与范围限制的边界,助你明智选择,避免程序中的“财务黑洞”。
深入探讨Java中树形结构与平铺列表(List)互转的艺术。文章详尽剖析了递归与非递归两种实现方法,包括从树到平铺的两种策略,以及将扁平数据重构为树的技巧。无论追求代码简洁还是规避栈溢出风险,这里都有你的最佳实践。