WebLogic Server部署EAR后HTTP Get方法失效问题咨询
问题描述
本地运行正常的HTTP GET方法,打包为EAR部署到WebLogic Server后无法正常工作。该方法通过按钮的ActionListener触发调用,代码实现如下:
private String httpGetMethod(String number) { String Result = null; try { OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = RequestBody.create(mediaType, ""); // 目标API地址 String URL = "https://apilink"; Request request = new Request.Builder().url(URL).method("GET", null).build(); Response response = client.newCall(request).execute(); String InitResult = response.body().string(); Result = InitResult; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return Result; }
排查与解决方向
- 网络访问限制:WebLogic所在服务器可能存在防火墙规则,或WebDomain配置了代理,导致无法访问目标API。检查服务器网络连通性(可通过
telnet或curl测试目标API地址),同时查看WebDomain的setDomainEnv脚本中是否设置了代理参数(如http.proxyHost、http.proxyPort)。 - 类加载冲突:WebLogic自带的HTTP相关类与OkHttpClient依赖类冲突。在EAR的
META-INF/weblogic-application.xml中添加类加载优先级配置,强制应用使用自身打包的OkHttp库:
<weblogic-application> <prefer-application-packages> <package-name>okhttp3.*</package-name> <package-name>okio.*</package-name> </prefer-application-packages> </weblogic-application>
- SSL证书信任问题:WebLogic的默认信任库未包含目标API的SSL证书,导致请求被拒绝。可将目标API的证书导入WebLogic的信任库(默认路径为
$DOMAIN_HOME/lib/DemoTrust.jks),或在OkHttpClient中临时配置自定义信任管理器(仅用于测试环境):
// 测试环境临时忽略证书验证,生产环境禁用 TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) {} public void checkServerTrusted(X509Certificate[] chain, String authType) {} public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } }; SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new SecureRandom()); OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager)trustAllCerts[0]) .hostnameVerifier((hostname, session) -> true) .build();
- 同步调用阻塞容器线程:在UI的ActionListener中执行同步HTTP请求会阻塞WebLogic的工作线程,可能被容器中断。改用OkHttp的异步调用方式:
client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理请求失败,注意日志记录 } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String result = response.body().string(); // 处理返回结果,UI更新需切换至EDT线程 SwingUtilities.invokeLater(() -> { // 更新UI组件 }); } } });
- 异常日志排查:本地的
e.printStackTrace()输出在WebLogic中可能未被正确捕获。改用WebLogic的日志API记录异常,便于在服务器日志中查看具体错误:
import weblogic.logging.Logger; import weblogic.logging.LoggingHelper; private static final Logger logger = LoggingHelper.getLogger(YourClassName.class); // 异常捕获块中替换为: catch (IOException e) { logger.error("HTTP请求失败", e); }
内容的提问来源于stack exchange,提问作者Deepak Ruhela
相关产品推荐
相关产品推荐

