来自客户端的响应(休息呼叫)具有JSON元素,如USERId。 相关的java变量如下
@JsonProperty("USERId")
private String uSERId;
我正在使用spring RestTemplate进行此rest调用,并用于从JSON映射到JAVA,我正在使用GSON。 我已经完全排除了jackson databind,它是spring rest模板的默认映射器,如下所示。
this.getMessageConverters().removeIf(converter -> converter.getClass().getName().equals(MappingJackson2HttpMessageConverter.class.getName()));
GsonHttpMessageConverter messageConverter = new GsonHttpMessageConverter();
messageConverter.setGson(gson);
this.getMessageConverters().add(messageConverter);
这样,我确保仅将GSON用于映射。
当我直接点击邮递员的客户休息服务时,我看到该文件具有一个值-“ USERId”:“ 025076373”。 但是RestTemplate的响应对象没有此字段,即所有其他具有正确Java规范命名的字段均已正确映射。 我的意思是respone对象中的所有其他字段都映射有响应json中的值。响应对象没有uSERId或相应的值。
我相信这个问题可能是由于命名约定很奇怪,但是对于MappingJackson2HttpMessageConverter来说,它也可以正常工作。
我尝试通过编写适配器并将其分配给gsonBuilder,然后将其设置为GsonHttpMessageConverter来进行调试。
gsonBuilder.registerTypeHierarchyAdapter(String.class, new StringTypeAdapter().nullSafe())
在调试适配器时,我可以看到除USERId之外的所有其他字段。
jackson databind的对象映射器具有属性MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES,我相信这是同一字段运行jackson的原因。 我找不到与GSON类似的房产。 有关如何解决此问题的任何指示都将非常有帮助。
使用的技术: 弹簧靴 春季休息模板 com.google.code.gson:gson:2.8.6
答案 0 :(得分:0)
尝试使用此@SerializedName替换@JsonProperty注释。
示例:
import com.google.gson.annotations.SerializedName;
public class Foo {
@SerializedName("USERId")
private String uSERId;
}
编辑:
第二个选项是使用自定义JsonDeserializer。这是一个示例:
public class UserDeserializer implements JsonDeserializer<User> {
@Override
public User deserialize(JsonElement paramJsonElement, Type paramType,
JsonDeserializationContext paramJsonDeserializationContext) throws JsonParseException {
User user = new Gson().fromJson(paramJsonElement.getAsJsonObject(), User.class);
try {
String id = null;
if (paramJsonElement.getAsJsonObject().get("USERId") != null) {
id = paramJsonElement.getAsJsonObject().get("USERId").getAsString();
}
user.setuSERId(id);
} catch (IllegalArgumentException e) {
throw new RuntimeException(e);
}
return user;
}
然后像这样创建自己的Gson:
Gson customGson = new GsonBuilder()
.registerTypeAdapter(User.class, new UserDeserializer())
.create();
并将其设置在您的转换器上
messageConverter.setGson(customGson);