如何解决java.util.Collections$SingletonList无法转换为java.lang.String的异常?
问题描述
我已将微软Partner Center Java示例项目克隆到本地Eclipse中,运行partnerconsent项目时出现类型转换异常:
class java.util.Collections$SingletonList cannot be cast to class java.lang.String (java.util.Collections$SingletonList and java.lang.String are in module java.base of loader 'bootstrap')
对应的堆栈跟踪信息:
java.lang.ClassCastException: class java.util.Collections$SingletonList cannot be cast to class java.lang.String (java.util.Collections$SingletonList and java.lang.String are in module java.base of loader 'bootstrap') at com.nimbusds.oauth2.sdk.util.URLUtils.serializeParameters(URLUtils.java:103) at com.microsoft.aad.adal4j.AdalTokenRequest.toOAuthRequest(AdalTokenRequest.java:160) at com.microsoft.aad.adal4j.AdalTokenRequest.executeOAuthRequestAndProcessResponse(AdalTokenRequest.java:86) at com.microsoft.aad.adal4j.AuthenticationContext.acquireTokenCommon(AuthenticationContext.java:930) at com.microsoft.aad.adal4j.AcquireTokenCallable.execute(AcquireTokenCallable.java:70) at com.microsoft.aad.adal4j.AcquireTokenCallable.execute(AcquireTokenCallable.java:38) at com.microsoft.aad.adal4j.AdalCallable.call(AdalCallable.java:47) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833)
解决方法
这个异常的核心原因是OAuth请求参数序列化时,将SingletonList类型对象强行转换为String,结合项目场景和堆栈信息,主要排查以下几点:
检查权限范围(scope)参数传递:
项目中调用ADAL4J的acquireToken系列方法时,若将scope参数包装成了List(比如Collections.singletonList("xxx")),而当前版本的ADAL4J要求直接传入String类型(多scope用空格分隔),就会触发这个转换错误。把List类型的scope改成直接传字符串即可。升级ADAL4J依赖版本:
部分旧版本的ADAL4J与Nimbus OAuth SDK存在兼容性问题,导致参数处理逻辑异常。尝试将ADAL4J依赖升级到最新稳定版,修复此类类型转换的bug。
内容的提问来源于stack exchange,提问作者ab.it.gcp
相关产品推荐
相关产品推荐

