2013-03-27 1 views
1

У меня есть два объекта, опрос и информация.Как заказать хешсет в Джексоне? @JsonPropertyOrder не работает

Survey Entity:

@RooJavaBean 
@RooToString 
@RooJpaActiveRecord(table = "information") 
@JsonPropertyOrder({ "seq"}) 
public class Information { 

    @NotNull 
    private String title; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JsonBackReference 
    private Survey survey; 

    private int seq; 
} 

Информация Entity:

@RooJavaBean 
@RooToString 
@RooJpaActiveRecord(table = "survey") 
public class Survey { 
    @NotNull 
    @Size(min = 3, max = 50) 
    private String title; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="survey") 
    @JsonManagedReference 
    private Set<Information> informations = new HashSet<Information>(); 

} 

Я использовал Джексон сериализацию.

Что я ожидаю:

{ 
    "survey" : { 
    "title" : "Medical Survey", 
    "informations" : [ { 
     "id" : 1, 
     "seq" : 0, 
     "title" : "Name:", 
     "version" : 0 
    }, { 
     "id" : 2, 
     "seq" : 1, 
     "title" : "Age:", 
     "version" : 0 
    }, { 
     "id" : 3, 
     "seq" : 2, 
     "title" : "test", 
     "version" : 0 
    }, { 
     "id" : 4, 
     "seq" : 3, 
     "title" : "test", 
     "version" : 0 
    } ], 
    "id" : 1, 
    "version" : 134 
    } 
} 

Но что это выходит:

{ 
    "survey" : { 
    "title" : "Medical Survey", 
    "informations" : [ { 
     "id" : 2, 
     "seq" : 1, 
     "title" : "Age:", 
     "version" : 0 
    }, { 
     "id" : 4, 
     "seq" : 3, 
     "title" : "test", 
     "version" : 0 
    }, { 
     "id" : 3, 
     "seq" : 2, 
     "title" : "test", 
     "version" : 0 
    }, { 
     "id" : 1, 
     "seq" : 0, 
     "title" : "Name:", 
     "version" : 0 
    } ], 
    "id" : 1, 
    "version" : 134 
    } 
} 
  1. Я знаю, что, используя список должен быть более подходящим в данном случае, но Spring Roo не может список поддержки в эшафоте. Поэтому я использовал HashSet с номером seq в нем.
  2. Я также знаю, что я могу создать список массива информации, который будет @transient, а затем клонировать и сортировать его в бизнес-слое.

Но я хотел бы знать, есть ли какое-либо более чистое решение, то есть заказывать при сериализации. Благодарю.

ответ

2

Невозможно заказать HashSet, это просто нормальное поведение Java. Вместо этого вы видите TreeSet. Поставьте его компаратором или реализуйте Comparable в своем информационном классе, и ваш Json будет заказан.

+0

Это означает, что HashSet не может быть сериализован в порядке с использованием Джексона, я прав? –

+0

У Джексона нет контроля над заказом Set, будь то HashSet, TreeSet или любая другая реализация Set. @JsonPropertyOrder предназначен для заказа свойств Json объекта (и карты в меньшей степени), а не для массива. Вы просто не можете контролировать порядок объектов в HashSet, это часть его дизайна. –

+0

Получил это. Большое спасибо!! –