Уничтожение JSON в объект с перегруженными методами с использованием Jackson

Я пытаюсь десериализовать объект JSON, хранящийся в CouchDb, используя Jackson. Этот объект должен десериализоваться в pojo, который содержит перегруженные методы. Когда я пытаюсь извлечь объект из кушетки и выполнить десериализацию, я получаю следующее исключение:

org.ektorp.DbAccessException: org.codehaus.jackson.map.JsonMappingException: Конфликтные определения сеттера для свойство "множитель": com.db.commodities.framework.sdos.model.security.EqOpt # setMultiplier (1 params) против com.db.commodities.framework.sdos.model.security.EqOpt # setMultiplier (1 PARAMS)

Я попытался аннотировать установщик, который хотел бы использовать Джексон, но похоже, что он не сработал.

@JsonProperty("multiplier")
public void setMultiplier(SDOSAttribute multiplier) {
     this.multiplier = multiplier;
}

public void setMultiplier(double multiplier) {
     this.multiplier.setValue(String.valueOf(multiplier));
}

Как настроить Jackson для правильной десериализации с использованием определенного метода? Или я неправильно подхожу к этой проблеме?

EDIT:

Я внес следующие изменения. Кажется, это работает, но немного уродливее. Если у кого-то есть лучший способ сделать это, не стесняйтесь делиться, и я с радостью соглашусь.

@JsonProperty("multiplier")
protected void setMultiplierAttribute(SDOSAttribute multiplier) {
    this.multiplier = multiplier;
}

@JsonIgnore
public void setMultiplier(double multiplier) {
    this.multiplier.setValue(String.valueOf(multiplier));
}

Ответ 1

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

Вот простой пример, чтобы продемонстрировать этот момент.

input.json: {"value":"forty-two"}

Foo.java:

import java.io.File;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;

public class Foo
{
  String value;

  public String getValue() {return value;}
  public void setValue(String value) {this.value = value;}

  @JsonIgnore
  public void setValue(int value) {this.value = String.valueOf(value);}

  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    Foo foo = mapper.readValue(new File("input.json"), Foo.class);
    System.out.println(mapper.writeValueAsString(foo));
  }
}

Если вы не хотите изменять первоначальные POJO defs с помощью аннотации Jackson, вы можете использовать MixIn.

import java.io.File;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;

public class Foo
{
  String value;

  public String getValue() {return value;}
  public void setValue(String value) {this.value = value;}
  public void setValue(int value) {this.value = String.valueOf(value);}

  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    mapper.getDeserializationConfig().addMixInAnnotations(Foo.class, IgnoreFooSetValueIntMixIn.class);
    Foo foo = mapper.readValue(new File("input.json"), Foo.class);
    System.out.println(mapper.writeValueAsString(foo));
  }
}

abstract class IgnoreFooSetValueIntMixIn
{
  @JsonIgnore public abstract void setValue(int value);
}

Ответ 2

В Jackson > 2.4 используйте напрямую:

mapper.addMixIn(Foo.class, IgnoreFooSetValueIntMixIn.class);

Ответ 3

В тех случаях, когда @JsonIgnore не помогает (у меня в настоящее время есть такой случай, но я все еще не уверен в причине), вместо этого также можно использовать @XmlTransient.