2013-09-25 4 views
3

Весной 3.3 У меня есть объект, который сопоставляется с таблицей базы данных. В этом классе сущности я имею все свойства, аннотированные с помощью @JsonProperty, например @JsonProperty («ID»). Включение контроллера приводит к получению такого объекта с помощью DAO/репозитория. Это работает хорошо, но когда я отправляю этот объект обратно запрашивающему, используя @ResponseBody, все свойства отправляются дважды. Как только требуется, но еще одно время начинается в нижнем регистре до тех пор, пока не появится первая буква верблюда. Пример ...Свойства объекта сериализованы дважды

public class MyEntity { 
    @JsonProperty("MYSpecialSuperId") 
    private String MYSpecialSuperId; 

    ... 

    public String getMYSpecialSsuperId() { 
     return this.MYSpecialSuperId; 
    } 

} 

После JSON stringifying результат является:

{ "MYSpecialSuperId":""9", "myspecialSuperId":"9" } 

Почему свойство дважды в результате и почему буквенное разные ???

BTW: Это была не моя идея, чтобы свойства Java начинались с прописной буквы, даже с более чем одной заглавной буквой.

+0

Я думаю, что это та же проблема: http://stackoverflow.com/questions/7557397/jackson-json-java-class-fields-are-serialized-multiple-times, или даже это: http: // stackoverflow .com/questions/7105745/how-to-define-jackson-only-use-fields-желательно-глобально – Katona

ответ

6

Jackson's ObjectMapper использует шаблон Java bean. Другими слова, он ожидает, что следующие

public class Foo { 
    public Object bar; 

    public Object getBar() {...} 

    public void setBar(Object bar) {...} 
} 

методы получения и установки начинают с get и set, соответственно, и затем соответствующим именем поля с его первой буквой. Если вы измените код

public class MyEntity { 
    @JsonProperty("MYSpecialSuperId") 
    private String mySpecialSuperId; 

    ... 

    public String getMySpecialSuperId() { 
     return this.mySpecialSuperId; 
    } 

} 

Обратите внимание, что поле начинается с нижним регистром my вместо верхнего регистра (независимо от значения @JsonProperty), я удалил лишние s в getMYSpecialSsuperId и использовать строчную y. Итак, теперь имя поля совпадает с именем получателя, и Джексон знает, что свойство такое же, и его не нужно сериализовать дважды.

Если у вас нет выбора, вы можете следить за то, что Katona posted in the comments и использовать

@JsonAutoDetect(getterVisibility=Visibility.NONE) 

сделать джексон игнорировать добытчик полностью и использовать только поля для сериализации JSON.

+0

Ну, у меня нет возможности изменить имена свойств (но я работаю над этим;)).Таким образом, некоторые свойства называются так: ABCDOneOfMyProperty (я ненавижу, но мне нужно жить с ним). Аннотации @JsonAutoDetect (getterVisibility = Visibility.NONE) сделали трюк. Спасибо. :)) –

1

Я думаю, что у вас есть опечатка в вашем аксессуаре; если он имеет «SsuperId», он не совпадает с именем поля; и как таковое поле и геттер воспринимаются как разные логические свойства.

+0

Это само по себе не устраняет общую проблему. –

+0

Проблема связана с несоответствием между именем, извлеченным из getter, именем поля: Я предполагаю, что это связано с нестандартным именованием (несколько заглавных букв в качестве префикса). Вам может потребоваться повторить аннотацию '@ JsonProperty' для getter. – StaxMan

+0

Прошу прощения. Мои пальцы виноваты в этой опечатке. ;) В реальном коде у меня нет этой опечатки ... только здесь, задавая этот вопрос. –

Смежные вопросы