写了几年代码,还是会踩 ArrayIndexOutOfBoundsException 的坑
从异常信息到排查思路,梳理 Java 数组越界的常见原因和处理方式,附带一段边界检查的写法。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-07-12 04:15:47 Spring RestTemplate GET请求 请求头 Java
有段时间没写直接调 HTTP 接口的代码了,最近碰到一个场景需要在 GET 请求里塞上 Authorization 和几个业务头,习惯性地想用 RestTemplate 的 getForObject,结果发现根本传不了自定义 Headers。
稍微翻了下文档,得用 exchange 方法,顺便就把整个流程跑通了,这里记录一下,省得下次再从头翻。
依赖很简单,pom.xml 里加上 spring-web 就行,我用的 5.3.23,当时项目 Spring Boot 版本带的正好是这个,如果你用更高版本应该也没啥问题。
<?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:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>resttemplate-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.23</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<mainClass>com.example.RestTemplateDemo</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
代码部分,核心就是三步:构建 HttpHeaders、包成 HttpEntity、然后用 exchange 发出去。别用 getForObject 或者 getForEntity,那两个都没地方让你塞请求头,线上因为这个吃过亏,请求发出去对方一直报 401,查了半天发现头根本没带过去。
下面是完整的可运行示例,我把注释也写里面了,看起来直观点。
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import java.util.Collections;
public class RestTemplateDemo {
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
// 拼请求头,这里按照实际需要加
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer your_token_here");
headers.set("X-Custom-Header", "value123");
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
// 封装成 HttpEntity,GET 请求体就是 null,其实我们没传 body,构造函数自动处理了
HttpEntity<String> requestEntity = new HttpEntity<>(headers);
// 目标 URL,参数用占位符,防止自己拼字符串出问题
String url = "https://api.example.com/data?param1={param1}";
// 发请求,必须用 exchange
ResponseEntity<String> response = restTemplate.exchange(
url,
HttpMethod.GET,
requestEntity,
String.class,
Collections.singletonMap("param1", "test_value")
);
// 看看返回了啥
System.out.println("Status Code: " + response.getStatusCode());
System.out.println("Response Body: " + response.getBody());
System.out.println("Response Headers: " + response.getHeaders());
}
}
把这两个文件放到标准 Maven 项目结构里,src/main/java/com/example/ 下面放 Java 文件,pom.xml 放项目根目录,然后执行 mvn clean compile exec:java 就能跑起来。
如果你只是想验证,直接复制到 IDE 里也行。
这个地方其实容易踩坑的细节还有几个:HttpHeaders 的 set 方法会覆盖同名的旧值,如果同一个头要传多个值,得用 add。还有 setAccept 那里得用 Collections.singletonList,不能直接传单个 MediaType,不然编译不过。
另外 exchange 方法最后一个参数是 uriVariables,如果 URL 里没有占位符,可以省略或者传 null,但建议保持占位符的习惯,避免特殊字符转义问题。
至于接收响应,用了 ResponseEntity,可以直接拿到状态码、响应头、响应体,后面不管是转成对象还是做错误处理都方便。如果返回的是 JSON,把 String.class 换成你对应的实体类,再配合 MappingJackson2HttpMessageConverter 就能自动反序列化,不过那就需要额外引入 jackson-databind 依赖,这里就不展开了。
总之,RestTemplate 的 GET 请求想带自定义头,忘掉 getForObject,直接用 exchange 构建 HttpEntity 完事儿。
从异常信息到排查思路,梳理 Java 数组越界的常见原因和处理方式,附带一段边界检查的写法。
线上出现NoClassDefFoundError: Could not initialize class时的排查思路和常见原因
记录用 WireMock 挡服务时,通过 JSON 映射文件和 Java API 做请求头匹配、响应头与响应体配置的两种方式及细节。
记录在 Aspose.PDF 里加载本地 TTF 字体,以及绕过 TTC 格式不支持问题的两种可行方案。
面对Java解析XML,DOM与DOM4J是两大主流选择。本文详尽分析标准DOM的内置优势与DOM4J在API简洁性、性能及XPath支持上的卓越表现。无论小型配置还是大型数据处理,助你理解两者差异,做出明智的技术选型。