2、调用第三方采用feign注解式接口
问题分析
APIResultTO是一个api通用接口返回泛型类,TenantOrg为传入的具体泛型类,咱们来看下出问题的类:
@Getter
@Setter
@NoArgsConstructor
public class TenantOrg {
/**
*/
@JsonProperty(“Id”)
private String Id;
/**
- 父级Id
*/
@JsonProperty(“PId”)
private String PId;
/**
- 租户代码
*/
@JsonProperty(“Tenant”)
private String tenant;
/**
- 组织架构名字
*/
@JsonProperty(“Name”)
private String name;
}
必须要用@JsonProperty(“Id”)或者@JsonSetter(“Id”)注解来显示声明属性名字,尤其是首字母为大写的情况,否则反序列化后的数据就为空值。为什么TenantOrg类中的Id等其他属性跟第三方服务返回的json数据字段完全一致,却没有成功设置对应的属性呢,这个就要看下BeanDeserializer类的deserializeFromObject方法,从其名字上我们可以看出这是将请求返回的数据反序列化成对应的类对象:
public Object deserializeFromObject(JsonParser p, DeserializationContext ctxt) throws IOException
{
/* 09-Dec-2014, tatu: As per [databind#622], we need to allow Object Id references
-
to come in as JSON Objects as well; but for now assume they will
-
be simple, single-property references, which means that we can
-
recognize them without having to buffer anything.
-
Once again, if we must, we can do more complex handling with buffering,
-
but let’s only do that if and when that becomes necessary.
*/
if ((_objectIdReader != null) && _objectIdReader.maySerializeAsObject()) {
if (p.hasTokenId(JsonTokenId.ID_FIELD_NAME)
&& _objectIdReader.isValidReferencePropertyName(p.getCurrentName(), p)) {
return deserializeFromObjectId(p, ctxt);
}
}
if (_nonStandardCreation) {
if (_unwrappedPropertyHandler != null) {
return deserializeWithUnwrapped(p, ctxt);
}
if (_externalTypeIdHandler != null) {
return deserializeWithE