Поведение ObjectMapper по умолчанию

У меня есть объект класса, который я конвертирую в json с помощью jackson ObjectMapper. После преобразования он делает двойные записи для каждой переменной. Является ли такое поведение нормальным, и если да, то может ли кто-нибудь объяснить мне это?

На данный момент я понимаю, что средство отображения объектов использует аннотацию @JsonProperty для создания fieldNames.

@Data
@Entity
@Table(name = "oracle_blob")
public class OracleBlob {

    @Id
    @GenericGenerator(name = "native", strategy = "native")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    @Column(name ="id")
    @JsonIgnore
    private Long id;

    @Column(name ="source_entity")
    @JsonProperty("Source_Entity")
    private String Source_Entity;

    @Column(name ="interface_name")
    @JsonProperty("Interface_Name")
    private String Interface_Name;

    @Column(name ="batch_id")
    @JsonProperty("Batch_Id")
    private String Batch_Id;

    @Column(name ="message")
    @JsonProperty("Message_Content")
    private String Message_Content;

}

Выход

{
   "source_Entity":"test source2",
   "interface_Name":"test Interface Name2",
   "batch_Id":"testbatchId2",
   "message_Content":"test message2",
   "Source_Entity":"test source2",
   "Interface_Name":"test Interface Name2",
   "Batch_Id":"testbatchId2",
   "Message_Content":"test message2"
}

person Napstablook    schedule 31.07.2018    source источник
comment
Попробуйте удалить аннотации @JsonProperty.   -  person Martín Zaragoza    schedule 31.07.2018


Ответы (1)


Не используйте заглавные буквы для имен полей, потому что Джексон будет анализировать геттеры (сгенерированные lombok в вашем примере) и искать interface_name на основе getInterface_Name() + одно поле для @JsonProperty("Interface_Name") и т. Д.

В Jackson 2.5 был добавлен MapperFeature.USE_STD_BEAN_NAMING, включение которого обеспечивает необходимую обработку. По умолчанию он отключен из соображений обратной совместимости. Другой альтернативой (и единственным вариантом, если вы используете более раннюю версию) было бы также аннотировать геттер с помощью @JsonProperty; в таком случае поле и геттер будут правильно связаны.

Полный ответ см. Здесь: https://github.com/FasterXML/jackson-databind/issues/729#issuecomment-84761480

person nmyk    schedule 31.07.2018