Jackson ObjectMapper在映射到POJO中的Double类型字段时将整数值转换为null



请耐心听我说。我已经通过了很多链接,但我不能找到我的情况下的解决方案。我需要帮助。

注意:我不能改变JSON请求(在Test中表示为map)

这是我的POJO:

public class TestModelWithDoubleField {
private Double frequency;
public Double getFrequency(){
return frequency;
}
/**
* @param frequency the frequency to set
*/
public void setFrequency(Double frequency) {
this.frequency = frequency;
}
/**
* @param frequency the frequency to set
*/
@JsonIgnore
public void setFrequency(Integer frequency) {
if(frequency != null) {
setFrequency(new Double(frequency));
}
}
}

下面是失败的测试:

@Test
public void testWithIntegerValueConvertToDoubleFieldInPOJO() throws IOException {
final Map<String, Integer> map = new HashMap<>();
map.put("frequency", 900);
TestModelWithDoubleField pojo = objectMapper.convertValue(map, TestModelWithDoubleField.class);
Assert.assertNotNull(pojo);
Assert.assertNotNull(pojo.getFrequency());   //-> This is giving output as null. Hence fails.
}

Assert.assertNotNull(pojo.getFrequency());中,频率为空。因此测试失败。

我想让它自动转换为Double类型。将@JsonIgnore放在另一个setter上也不起作用。

任何从映射中获取有效对象的方法都可以。

只需在所需的setter上添加@JsonProperty("frequency")。你甚至不需要@JsonIgnore在另一个。

public static class TestModelWithDoubleField
{
private Double frequency;
public Double getFrequency()
{
return frequency;
}
/**
* @param frequency the frequency to set
*/
@JsonProperty("frequency")
public void setFrequency(Double frequency)
{
this.frequency = frequency;
}
/**
* @param frequency the frequency to set
*/
public void setFrequency(Integer frequency)
{
if(frequency != null)
{
setFrequency(new Double(frequency));
}
}
}

只需删除public void setFrequency(Integer frequency)方法,它将工作:

public class TestModelWithDoubleField {
private Double frequency;
public Double getFrequency(){
return frequency;
}
public void setFrequency(Double frequency){
this.frequency = frequency;
}
}

既然你不能删除public void setFrequency(Integer frequency)方法,那么你可以用@JsonProperty注释另一个setter,将其定义为Jackson使用的setter:

public class TestModelWithDoubleField {
private Double frequency;
public Double getFrequency(){
return frequency;
}
@JsonProperty
public void setFrequency(Double frequency) {
this.frequency = frequency;
}
public void setFrequency(Integer frequency) {
if(frequency != null) {
setFrequency(new Double(frequency));
}
}
}

最新更新