Groovy遍历Map构建JWTClaimsSet链式调用报错解决
解决Nimbus JWT库中动态遍历Map添加Claims的问题
你的报错原因很明确:你把JWTClaimsSet.Builder对象和最终的JWTClaimsSet实例搞混了,而且代码里还有个小拼写错误——Builder类的单条添加claim的方法是claim(),不是claims()(后者是批量添加的方法,参数是Map)。
咱们一步步修正:
错误根源拆解
你之前的代码里,一开始把jwtClaims赋值为Builder实例,循环里又试图把Builder.claims()的返回值(还是Builder)重新赋值给它,最后直接把Builder对象当成JWTClaimsSet来处理,这就导致了类型转换异常。Builder的作用是逐步构建配置,只有调用build()方法才会生成真正的JWTClaimsSet对象。
修正后的代码(遍历Map版本)
static JSONObject GenerateJWT(Map mClaims){ // 先创建Builder实例,保持这个引用不变 JWTClaimsSet.Builder claimBuilder = new JWTClaimsSet.Builder() // 遍历Map,调用正确的claim()方法添加每条声明 mClaims.each { key, value -> // 如果你的键值本来就是字符串,toString()可以省略 claimBuilder.claim(key.toString(), value.toString()) } // 调用build()生成最终的JWTClaimsSet实例 JWTClaimsSet jwtClaims = claimBuilder.build() return jwtClaims.toJSONObject() }
更简洁的写法(批量添加)
其实Nimbus的Builder已经提供了批量添加的claims(Map)方法,完全不用手动遍历,一行搞定:
static JSONObject GenerateJWT(Map mClaims){ // 先把Map的键值都转成字符串(如果需要的话,不需要可以直接传mClaims) Map<String, String> stringClaims = mClaims.collectEntries { k, v -> [(k.toString()): v.toString()] } JWTClaimsSet jwtClaims = new JWTClaimsSet.Builder() .claims(stringClaims) .build() return jwtClaims.toJSONObject() }
这样调用MyClass.GenerateJWT(["claim1": "claim1", "claim2": "claim2"])就不会报错了,而且代码更简洁易读。
内容的提问来源于stack exchange,提问作者Asinus Rex
相关产品推荐
相关产品推荐

