微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Groovy DSL Spring 云合同为具有 Unicode 字符的查询参数抛出 java.lang.IllegalStateException

如何解决Groovy DSL Spring 云合同为具有 Unicode 字符的查询参数抛出 java.lang.IllegalStateException

我创建了一个如下所示的 groovy DSL 合同

import org.springframework.cloud.contract.spec.Contract

Contract.make {
    final def NAME_REGEX = '[A-Za-z0-9\\u00C0-\\u00FF\'\\- ]{1,70}'

    request {
        method 'GET'
        url('/api/getEmployess') {
            queryParameters {
                parameter 'name': $(c(regex(NAME_REGEX)),p('\u00CAdward J\u00F5hnson'))
            }
        }
        headers {
            contentType("application/json;charset=UTF-8")
        }
    }
    response {
        status OK()
        body([
                [
                 id           : $(p(regex(nonblank())),c('5a0eaf2012a9a12f1c98947a')),name         : fromrequest().query("name")
               ]
        ])
        headers { contentType("application/json;charset=UTF-8") }
    }
}

我的服务实现返回 'name' 和 'id' 作为响应。作为响应,'name' 是 Unicode 值 'Êdward Jõhnson',它与请求参数值不匹配。

我收到以下错误 -

Parsed JSON [[{"id":"5a0eaf2012a9a12f1c98947a","name":"Êdward Jõhnson"}]] doesn't match the JSON path [$[*][?(@.['name'] == 'Êdward Jõhnson')]]
java.lang.IllegalStateException: Parsed JSON [[{"id":"5a0eaf2012a9a12f1c98947a","name":"Êdward Jõhnson" }]] doesn't match the JSON path [$[*][?(@.['name'] == 'Êdward Jõhnson')]]
    at com.toomuchcoding.jsonassert.JsonAsserter.check(JsonAsserter.java:228)
    at com.toomuchcoding.jsonassert.JsonAsserter.checkBufferedJsonPathString(JsonAsserter.java:267)

我尝试在“名称”请求查询参数中以两种方式传递 Unicode 值 -

  1. 将 Unicode 字符作为 Unicode 数字,如上例所示 - 参数'名称':$(c(regex(NAME_REGEX)),p('\u00CAdward J\u00F5hnson'))
  2. 按原样放置 Unicode 字符 参数 'name': $(c(regex(NAME_REGEX)),p('Êdward Jõhnson'))

但是对于这两种情况,我都遇到了相同的错误。看起来有些编码问题,因为我的值 Êdward Jõhnson 更改为 Êdward Jõhnson,如错误所述。

请帮我解决这个问题。

解决方法

我找到了解决方法。作为响应“名称”字段生产者,我输入了与请求“名称”字段生产者相同的值。由于 groovy 对 unicode 值应用了不同的编码,因此失败。这只是解决问题的解决方法,而不是正确的最终解决方案。

import org.springframework.cloud.contract.spec.Contract

Contract.make {
     final def NAME_REGEX = '^[A-Za-z0-9À-ÿ'\-\s]{1,70}$'

     request {
                   method 'GET'
                   url('/api/getEmployess') {
                      queryParameters {
                          parameter 'name': $(c(regex(NAME_REGEX)),p('Êdward Jõhnson'))
                      }
                   }
                   headers {
                      contentType("application/json;charset=UTF-8")
                   }
           }
    response {
        status OK()
        body([
               [
                 id : $(p(regex(nonBlank())),c('4b0eaf2012a9a12f1c98567c')),name : $(p("Êdward Jõhnson"),c(fromRequest().body('$.name'))),]
           ])
           headers { contentType("application/json;charset=UTF-8") }
    }
 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。