Miraski z #java: jak musi byc zaannotowane JPA (Model) zeby Jackson zmapowal mi cos takiego poprawnie? Mam takiego JSON'a ktory jest wysylany POST zeby utworzyc EventDetail
{ "event":345, "date":"2017-07-09T05:47:31.054Z", "body":"test" } a model jest taki:
@Entity public class EventDetail{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name = "event_id") @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") @JsonIdentityReference(alwaysAsId = true) private Event event; private String body; private LocalDate date; Co zrobic zeby Jackson wiedzial, ze pole Event ma zmapowac jako referencje do Event? Poki co dostaje buga:
JSON parse error: Unresolved forward references for: ; nested exception is com.fasterxml.jackson.databind.deser.UnresolvedForwardReference: Unresolved forward references for: at [Source: (PushbackInputStream); line: 1, column: 58]Object id [346] (for com.project.server.model.Event) at [Source: (PushbackInputStream); line: 1, column: 12].]
@Ewentualnie: myslalem o DTO ale cos takiego jest tak powszechne ze myslalem ze jest gotowe rozwiazanie na to, a nie ze kazdy po kolei bierze DTO, potem new EventDetail, entity manager do ref'a i tyle. Jak rzeczywiscie nei ma na to gotowego rozwiazania z automatu to oczywiscie tak zrobie.
@trustME: moze jest inne rozwiazanie, ale takie jak pisze ma sens, wynika to z warstw ktore chcesz miec w projekcie i nie ze jak Ci sie zmieni troche baza danych to musisz poprawiac kod w 10 miejsach
@Ewentualnie też racja. Parę linijek kodu tylko. Używanie entity MANAGER w serwisie jest ok? Bo używam go wszędzie tam gdzie muszę powiązać rekordy a nie ma potrzeby wczytywac całego rekordy bo mam id i tyle mi potrzebne.
@trustME: moze troche nie w temat ale nie ma w twoim dev-envie takiego czegos jak w Visual Studio masz "Paste Special As JSON/XML Classes"? Kopiujesz jsona i wklejasz w VSie i samo Ci tworzy klasy.
jak musi byc zaannotowane JPA (Model) zeby Jackson zmapowal mi cos takiego poprawnie?
Mam takiego JSON'a ktory jest wysylany POST zeby utworzyc EventDetail
{"event":345,
"date":"2017-07-09T05:47:31.054Z",
"body":"test"
}
a model jest taki:
@Entitypublic class EventDetail{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "event_id")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonIdentityReference(alwaysAsId = true)
private Event event;
private String body;
private LocalDate date;
Co zrobic zeby Jackson wiedzial, ze pole Event ma zmapowac jako referencje do Event?
Poki co dostaje buga:
#programowanie
Jak rzeczywiscie nei ma na to gotowego rozwiazania z automatu to oczywiscie tak zrobie.
A tego probowales? http://www.jsonschema2pojo.org/
A co do mapowania to wiem tylko, ze w C# mapuje sie poprzez atrybuty np;
[JsonProperty(PropertyName = "Priorities")][XmlArray("Priorities"), XmlArrayItem(typeof(Priority), ElementName = "Priority")]
public List PrioritiesList { get; set; }