Załóżmy, że mam następujące podmioty JPA:REST: jak serializować obiekt Java do JSON w "płytki" sposób?
@Entity
public class Inner {
@Id private Long id;
private String name;
// getters/setters
}
@Entity
public class Outer {
@Id private Long id;
private String name;
@ManyToOne private Inner inner;
// getters/setters
}
Zarówno wiosną i Java EE mają implementacje REST z domyślnymi serializers które będą Marshall podmioty do/od JSON bez dalszego kodowania. Ale podczas konwersji Outer
do JSON, zarówno wiosną i EE gniazdem pełną kopię Inner
w nim:
// Outer
{
"id": "1234",
"name": "MyOuterName",
"inner": {
"id": "4321",
"name": "MyInnerName"
}
}
Jest to poprawne zachowanie, ale problematyczne dla moich usług internetowych, ponieważ wykresy obiektów można uzyskać głęboki/złożona i może zawierać odwołania kołowe. Czy istnieje sposób na skonfigurowanie dostarczonego elementu Marshall, aby zamiast niego uporządkować obiekty POJO/podmioty "płytko", bez potrzeby tworzenia niestandardowego serializatora JSON dla każdego z nich? Jeden niestandardowy serializator, który działa na wszystkich elementach, byłby w porządku. Ja bym idealnie jak coś takiego:
// Outer
{
"id": "1234",
"name": "MyOuterName",
"innerId": "4321"
}
ja też jak to się „wycofać” JSON z powrotem do równoważnych obiektu java. Dodatkowe bonusy, jeśli rozwiązanie działa zarówno w trybie Spring, jak i Java EE. Dzięki!
Dlatego używając jednostki utrwalania w REST API nie może być dobrym pomysłem. Spójrz na to [odpowiedź] (http://stackoverflow.com/a/36175349/1426227). Czy korzystanie z dostosowanych DTO jest opcją? –
@ CássioMazzochiMolin: Podoba mi się podejście, ale projekt jest już całkiem dojrzały. W tym momencie nie jest praktyczne przełączanie wszystkich istniejących usług (i ich klientów) na używanie DTO zamiast jednostek i nie chcę "mieszać i dopasowywać". –