Jackson ObjectMapper преобразует целочисленное значение в null при сопоставлении с полем двойного типа в POJO

#java #spring-boot #jackson #jackson-databind

Вопрос:

Пожалуйста, потерпи меня. Я прошел через множество ссылок, но я не могу найти решение для своего случая. Мне нужна помощь.

Примечание: Я не могу изменить запрос 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()); частота равна нулю. Следовательно, тест не проходит.

Я хочу, чтобы он автоматически преобразовывался в свой двойной тип. @JsonIgnore Надеть другого сеттера тоже не получилось.

Любой подход к получению действительного объекта с этой карты подойдет.

Ответ №1:

Просто добавьте @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));
      }
  }
}
 

Комментарии:

1. Уоу, чувак. Ты сделал мой день лучше. Я не могу отблагодарить вас.

Ответ №2:

Просто отбросьте этот 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 определив его как сеттер, который будет использоваться Джексоном:

 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));
        }
    }
}