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