When I added this code and dependency to my own IDE (IntelliJ IDEA), I also see the error "Cannot resolve overloaded constructor TokenRequest".
Running sbt compile reveals different errors:
First: "reassignment to val" (as Levi Ramsey pointed out in the comments on the question):
[error] /Users/tmoore/Projects/scala-scratch/src/main/scala/Test.scala:21:20: reassignment to val
[error] tokenRequest = new TokenRequest(uri, clientAuthentication, new ClientCredentialsGrant, Scope.parse(""), null, params)
[error] ^
[error] /Users/tmoore/Projects/scala-scratch/src/main/scala/Test.scala:24:20: reassignment to val
[error] tokenRequest = new TokenRequest(uri, clientAuthentication, new ClientCredentialsGrant, null, null, params)
[error] ^
[error] two errors found
[error] (Compile / compileIncremental) Compilation failed
This can fixed by changing tokenRequest to a var, or more idiomatically, removing the declaration for tokenRequest and allowing it to be returned directly from the if/else expressions.
Type mismatch for params:
[error] /Users/tmoore/Projects/scala-scratch/src/main/scala/Test.scala:20:102: type mismatch;
[error] found : java.util.concurrent.ConcurrentHashMap[String,List[String]]
[error] required: java.util.Map[String,java.util.List[String]]
[error] new TokenRequest(uri, clientAuthentication, new ClientCredentialsGrant, Scope.parse(""), null, params)
[error] ^
[error] /Users/tmoore/Projects/scala-scratch/src/main/scala/Test.scala:23:91: type mismatch;
[error] found : java.util.concurrent.ConcurrentHashMap[String,List[String]]
[error] required: java.util.Map[String,java.util.List[String]]
[error] new TokenRequest(uri, clientAuthentication, new ClientCredentialsGrant, null, null, params)
[error] ^
[error] two errors found
This happens because params.put("audience", List(audience)) uses scala.collection.immutable.List, which does not implement java.util.List. You'll need to change the type of params to new ConcurrentHashMap[String, java.util.List[String]].
You can convert List(audience) to a Java list by importing the conversion with import scala.jdk.CollectionConverters._ and then calling List(audience).asJava. See the Scala documentation on Conversions Between Java and Scala Collections for details.
Alternatively, you could build a Java list in the first place by importing java.util.Collections and using Collections.singletonList. For this example, I'm using this approach.
Here's the final code, which compiles in sbt and shows no errors in the editor:
import com.nimbusds.oauth2.sdk.{ClientCredentialsGrant, Scope, TokenRequest}
import com.nimbusds.oauth2.sdk.auth.ClientAuthentication
import java.net.URI
import java.util.Collections
import java.util.concurrent.ConcurrentHashMap
class Test {
val baseUrl: String = ???
private def makeTokenRequest(format: String, provider: String, scopes: String, audience: String, clientAuthentication: ClientAuthentication): TokenRequest = {
val uri = new URI(baseUrl + "?provider=" + provider + "&format=" + format)
val params = new ConcurrentHashMap[String, java.util.List[String]]
if (audience != null) {
params.put("audience", Collections.singletonList(audience))
}
if (scopes != null) {
new TokenRequest(uri, clientAuthentication, new ClientCredentialsGrant, Scope.parse(""), null, params)
} else {
new TokenRequest(uri, clientAuthentication, new ClientCredentialsGrant, null, null, params)
}
}
}
TokenRequest?tokenRequestto be aval, you can't assign to it later.