You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用HttpsURLConnection发起PATCH请求出现InaccessibleObjectException如何解决

问题根因

你采用的反射修改java.net.HttpURLConnection内部私有methods字段的方案,仅适配Java 8及更早版本。从Java 9引入模块系统后,JDK严格限制了对内部非公开API的反射访问权限,你遇到的InaccessibleObjectException就是因为java.base模块默认没有开放java.net包的内部访问权限给未命名模块,升级JDK17只会让限制更严格,自然无法解决问题。
这种依赖JDK内部实现的hack方案本身就不具备版本兼容性,不推荐长期使用。

解决方案

临时兼容方案(不推荐)

在JVM启动参数中添加以下配置,手动开放java.net包的访问权限:

--add-opens java.base/java.net=ALL-UNNAMED

如果你的项目是模块化项目,将ALL-UNNAMED替换为你的模块名即可。该方案仅能临时解决当前版本的运行问题,后续JDK版本升级仍可能失效。

推荐实现方案(无兼容问题)

方案1:使用Java 11+原生HttpClient

Java 11之后官方推出的标准HttpClient原生支持PATCH请求,无需任何hack:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;

public void sendPatchRequest(String url, String token, String requestBody) throws Exception {
    // 构建HttpClient实例
    HttpClient client = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(5))
            .build();

    // 构建PATCH请求
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(url))
            .timeout(Duration.ofSeconds(5))
            .header("Content-Type", "application/json; utf-8")
            .header("Accept", "application/json")
            .header("Authorization", "OAuth " + token)
            .method("PATCH", HttpRequest.BodyPublishers.ofString(requestBody))
            .build();

    // 发送请求获取响应
    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    // 后续自行处理响应结果
}

方案2:HttpURLConnection无反射兼容方案

如果你必须保留HttpURLConnection的使用,可以通过HTTP方法覆写头实现,无需修改JDK内部字段,前提是服务端支持X-HTTP-Method-Override头(绝大多数REST服务端框架默认支持):

public static void connectPATCHtoken(URL url, String token) {
    try {
        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); 
        // 实际发送POST请求,通过头标识为PATCH请求
        connection.setRequestMethod("POST");
        connection.setRequestProperty("X-HTTP-Method-Override", "PATCH");
        connection.setRequestProperty("Content-Type", "application/json; utf-8");
        connection.setRequestProperty("Accept", "application/json");
        connection.setDoOutput(true);
        connection.setRequestProperty("Authorization", "OAuth " + token);
        connection.setConnectTimeout(5000);
        connection.setReadTimeout(5000);
        setConnection(connection);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

方案3:使用第三方HTTP客户端库

可以选择OkHttp、Apache HttpClient等成熟的开源HTTP客户端,这些库原生支持PATCH请求,API更易用,版本兼容性也更好。

内容的提问来源于stack exchange,提问作者zvega

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:36:06