有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Groovy DSL Spring云契约抛出java。具有Unicode字符的查询参数的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)

我尝试在'name'请求查询参数中以两种方式传递Unicode值-

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

但对于这两种情况,我得到的是相同的错误。似乎存在一些编码问题,因为我的值Êdward Jõhnson更改为Êdward Jõhnson,如错误中所述

请帮我解决这个问题


共 (1) 个答案

  1. # 1 楼答案

    我找到了解决办法。在响应“name”字段producer时,我输入了请求“name”字段producer中的相同值。由于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") }
        }
     }