使用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://,或者格式错误)
解决方案
- 校验代理URL的有效性:
检查ConfigurationUtil.getProxyURL()的返回值,确保它不为null,且是完整的代理地址(例如http://proxy.example.com:8080) - 添加空值校验逻辑:
如果环境中可能不需要代理,可以在代码中增加判断,仅当代理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()); } - 确认代理URI格式:
确保代理URL包含协议(http/https)、主机名和端口(如果需要),避免使用相对路径或不完整的地址。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

