迭代Map以在Groovy中构建点符号链式方法

时间:2018-01-23 15:36:10

标签: groovy

该问题讨论了特定的库,但该问题适用于需要迭代的任何方法链。 Nimbus JWT + JOSE库有一个名为JWTClaimsSet的类,它允许您使用以下语法构建JWT:

        JWTClaimsSet jwtClaims = new JWTClaimsSet.Builder()
            .claim("claim1", "claim1")
            .claim("claim2", "claim2")
            .build()

我在这里要完成的是以编程方式添加声明。到目前为止我尝试过的是创建一个这样的类:

 static JSONObject GenerateJWT(Map mClaims){
    JWTClaimsSet jwtClaims = new JWTClaimsSet.Builder()


    mClaims.each {
        k,v ->
            jwtClaims = jwtClaims.claims(k.toString(),v.toString())
    }

    jwtClaims = jwtClaims.build()

    return jwtClaims.toJSONObject()

}

并称之为:

MyClass.GenerateJWT(["claim1": "claim1", "claim2": "claim2"])

然而,我得到一个错误说(事实确实如此):

  

不能与类 'com.nimbusds.jwt.JWTClaimsSet $生成器' 投对象 'com.nimbusds.jwt.JWTClaimsSet$Builder@12f9af83' 类 'com.nimbusds.jwt.JWTClaimsSet'

如何迭代地图并将每个项目设置为声明,值?

1 个答案:

答案 0 :(得分:2)

JWTClaimsSet是与JWTClaimsSet.Builder不同的类,因此您的静态输入会将其丢弃。构建器上的所有方法都返回一个Builder对象,以允许链接除之外的 build(),它返回最终JWTClaimsSet。我认为这应该有效:

static JSONObject GenerateJWT(Map mClaims) {
    JWTClaimsSet.Builder jwtClaimsBuilder = new JWTClaimsSet.Builder()

    mClaims.each { k, v ->
        jwtClaimsBuilder = jwtClaimsBuilder.claim(k.toString(), v.toString())
    }

    JWTClaimsSet jwtClaims = jwtClaimsBuilder.build()

    return jwtClaims.toJSONObject()
}