【问题标题】:Jackson ObjectMapper converts Integer value to null when mapped to Double type field in POJO当映射到 POJO 中的 Double 类型字段时,Jackson ObjectMapper 将 Integer 值转换为 null
【发布时间】:2021-12-11 22:19:03
【问题描述】:

请多多包涵。我浏览了很多链接,但找不到适合我的案例的解决方案。我需要帮助。

注意:我无法更改 JSON 请求(在测试中表示为地图)

这是我的 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 放在另一个设置器上也不起作用。

从该地图中获取有效对象的任何方法都可以。

【问题讨论】:

    标签: java spring-boot jackson jackson-databind


    【解决方案1】:

    只需删除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));
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      只需在所需的设置器上添加@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));
            }
        }
      }
      

      【讨论】:

      • 哇,伙计。你让我今天一整天都感觉很好。我非常感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      相关资源
      最近更新 更多