Groovy通过Jackson将Map转换为POJO,抱怨没有属性

Groovy通过Jackson将Map转换为POJO,抱怨没有属性,groovy,jackson,Groovy,Jackson,我正在尝试将一个映射从http响应转换为POJO。答案是 {_total=0} 在我的Pojo中,我想去掉下划线,所以我用@JsonProperty注释了字段。但是Groovy抱怨没有total属性 堆栈跟踪 org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '{_total=0}' with class 'java.util.LinkedHashMap' to class 'io.

我正在尝试将一个映射从http响应转换为POJO。答案是

{_total=0}
在我的Pojo中,我想去掉下划线,所以我用@JsonProperty注释了字段。但是Groovy抱怨没有total属性

堆栈跟踪

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '{_total=0}' with class 'java.util.LinkedHashMap' to class 'io.toro.linkedin.response.CompanyAdminsResponse' due to: org.codehaus.groovy.runtime.metaclass.MissingPropertyExceptionNoStack: No such property: _total for class: io.toro.linkedin.response.CompanyAdminsResponse
Possible solutions: total

    at io.toro.linkedin.connector.LinkedInConnector.linkedInListCompaniesThatUserIsAdminOf(LinkedInConnector.groovy:314)
    at LinkedInTest.list-companies-that-user-is-admin-of(LinkedInTest.groovy:115)
转换码

HttpResponseDecorator response = restClient.get(params)
ObjectMapper mapper = new ObjectMapper()
mapper.convertValue(response.data as Map, T)
波乔

包io.toro.linkedin.response
导入com.fasterxml.jackson.annotation.JsonProperty
导入groovy.transform.ToString
导入io.toro.linkedin.model.Company
/**
*@作者丹尼尔·戈麦斯
*/
@ToString(includeNames=true)
类别CompanyAdminResponse{
@JsonProperty(“U计数”)
整数计数
@JsonProperty(“U开始”)
整数开始
@JsonProperty(“总计”)
整数总计
列表值
}

我认为问题来自对
Map
的响应转换:
response.data as Map
,您正在将其传递给
mapper.convertValue
方法

我直接使用follow
Map
[\u total:3]
生成一个groovy脚本来测试您的问题,在正确创建对象时不会引发异常:

@Grab('com.fasterxml.jackson.core:jackson-core:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson-annotations:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson-databind:2.7.3')
@GrabExclude('org.codehaus.groovy:groovy-all')

import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.ObjectMapper
import groovy.transform.ToString

class Company {
}

@ToString(includeNames = true)
class CompanyAdminsResponse {
    @JsonProperty('_count')
    int count
    @JsonProperty('_start')
    int start
    @JsonProperty('_total')
    int total
    List<Company> values
}

ObjectMapper mapper = new ObjectMapper()
def object = [_total : 3]
println mapper.convertValue(object, CompanyAdminsResponse) 
// the above line prints CompanyAdminsResponse(count:0, start:0, total:3, values:null)
@Grab('com.fasterxml.jackson.core:jackson-core:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson注释:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson数据绑定:2.7.3')
@GrabExclude('org.codehaus.groovy:groovy-all')
导入com.fasterxml.jackson.annotation.JsonProperty
导入com.fasterxml.jackson.databind.ObjectMapper
导入groovy.transform.ToString
阶级公司{
}
@ToString(includeNames=true)
类别CompanyAdminResponse{
@JsonProperty(“U计数”)
整数计数
@JsonProperty(“U开始”)
整数开始
@JsonProperty(“总计”)
整数总计
列表值
}
ObjectMapper映射器=新的ObjectMapper()
def object=[[总计:3]
println mapper.convertValue(对象,CompanyAdminResponse)
//上行打印CompanyAdminResponse(计数:0,开始:0,总计:3,值:null)

希望这能有所帮助,

如果您去掉了toString注释,它能工作吗?不,它也不能工作。
@Grab('com.fasterxml.jackson.core:jackson-core:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson-annotations:2.7.3')
@Grab('com.fasterxml.jackson.core:jackson-databind:2.7.3')
@GrabExclude('org.codehaus.groovy:groovy-all')

import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.ObjectMapper
import groovy.transform.ToString

class Company {
}

@ToString(includeNames = true)
class CompanyAdminsResponse {
    @JsonProperty('_count')
    int count
    @JsonProperty('_start')
    int start
    @JsonProperty('_total')
    int total
    List<Company> values
}

ObjectMapper mapper = new ObjectMapper()
def object = [_total : 3]
println mapper.convertValue(object, CompanyAdminsResponse) 
// the above line prints CompanyAdminsResponse(count:0, start:0, total:3, values:null)