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

使用JAX-RS和Jersey连接Exchange Server时遇Host name may not be null错误

排查Jersey连接Exchange获取OAuth令牌时的"Host name may not be null"错误

问题场景

使用JAX-RS(Jersey)连接MS Exchange Server获取OAuth认证令牌时,抛出Host name may not be null异常,相关代码及错误信息如下:

核心代码

//Set up client configuration for proxy
ClientConfig config = new ClientConfig();
config.connectorProvider(new ApacheConnectorProvider());
config.property(ClientProperties.PROXY_URI, ConfigurationUtil.getProxyURL());
config.property(ClientProperties.PROXY_USERNAME, ConfigurationUtil.getUser());
config.property(ClientProperties.PROXY_PASSWORD, ConfigurationUtil.getPassword());

//Set up the form
Form form = new Form();
form.param(OAUTH_GRANT_TYPE, OAUTH_GRANT_TYPE_VALUE);
form.param("client_id", CLIENT_ID);
form.param("client_secret", CLIENT_SECRET);
form.param("scope", "https://outlook.office365.com/EWS.AccessAsUser.All");

//Set the url and make the call
Response response = ClientBuilder.newClient(config)
                .target("login.microsoftonline.com")
                .path(TENANT_NUMBER)
                .path("oauth2")
                .path("v2.0")
                .path("token")
                .request()
                .put(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED));

错误信息

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.IllegalArgumentException: Host name may not be null

完整堆栈跟踪

Exception in thread "main" java.lang.ExceptionInInitializerError
at com.vanguard.tip.ims.fis.service.EmailService.getInstance(EmailService.java:134)
at com.vanguard.tip.ims.fis.factories.ServiceFactory.createExchangeMailService(ServiceFactory.java:32)
at com.vanguard.tip.ims.fis.controller.SmartController.execute(SmartController.java:86)
at com.vanguard.tip.ims.fis.batchlauncher.SmartRunner.run(SmartRunner.java:55)
at com.vanguard.tip.ims.fis.batchlauncher.Launcher.main(Launcher.java:42)
Caused by: java.lang.IllegalArgumentException: Host name may not be null
at org.apache.http.util.Args.containsNoBlanks(Args.java:81)
at org.apache.http.HttpHost.<init>(HttpHost.java:80)
at org.glassfish.jersey.apache.connector.ApacheConnector.<init>(ApacheConnector.java:259)
at org.glassfish.jersey.apache.connector.ApacheConnectorProvider.getConnector(ApacheConnectorProvider.java:116)
at org.glassfish.jersey.client.ClientConfig$State.initRuntime(ClientConfig.java:425)
at org.glassfish.jersey.client.ClientConfig$State.access$000(ClientConfig.java:90)
at org.glassfish.jersey.client.ClientConfig$State$3.get(ClientConfig.java:122)
at org.glassfish.jersey.client.ClientConfig$State$3.get(ClientConfig.java:119)
at org.glassfish.jersey.internal.util.collection.Values$LazyValueImpl.get(Values.java:340)
at org.glassfish.jersey.client.ClientConfig.getRuntime(ClientConfig.java:733)
at org.glassfish.jersey.client.ClientRequest.getConfiguration(ClientRequest.java:286)
at org.glassfish.jersey.client.JerseyInvocation.validateHttpMethodAndEntity(JerseyInvocation.java:135)
at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:105)
at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:101)
at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:92)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:437)
at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:343)
at com.vanguard.tip.ims.fis.service.EmailService.getOAuthToken(EmailService.java:203)
at com.vanguard.tip.ims.fis.service.EmailService.initializeService(EmailService.java:263)
at com.vanguard.tip.ims.fis.service.EmailService.<init>(EmailService.java:109)
at com.vanguard.tip.ims.fis.service.EmailService.<init>(EmailService.java:95)
at com.vanguard.tip.ims.fis.service.EmailService$SingletonHolder.init(EmailService.java:122)
at com.vanguard.tip.ims.fis.service.EmailService$SingletonHolder.<clinit>(EmailService.java:115)

错误原因分析

从堆栈跟踪可以定位到,异常起源于org.apache.http.HttpHost的初始化,说明Jersey的Apache连接器在解析代理URI时无法提取有效的主机名。根本原因有两种可能:

  • ConfigurationUtil.getProxyURL()返回了null值,导致代理配置中没有有效的主机信息
  • 返回的代理URI格式不符合标准(比如缺少协议前缀http:///https://,或者格式错误)

解决方案

  1. 校验代理URL的有效性:
    检查ConfigurationUtil.getProxyURL()的返回值,确保它不为null,且是完整的代理地址(例如http://proxy.example.com:8080)
  2. 添加空值校验逻辑:
    如果环境中可能不需要代理,可以在代码中增加判断,仅当代理URL有效时才配置代理属性:
    String proxyUrl = ConfigurationUtil.getProxyURL();
    if (proxyUrl != null && !proxyUrl.trim().isEmpty()) {
        config.property(ClientProperties.PROXY_URI, proxyUrl);
        config.property(ClientProperties.PROXY_USERNAME, ConfigurationUtil.getUser());
        config.property(ClientProperties.PROXY_PASSWORD, ConfigurationUtil.getPassword());
    }
    
  3. 确认代理URI格式:
    确保代理URL包含协议(http/https)、主机名和端口(如果需要),避免使用相对路径或不完整的地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:15:40