Неразрешенные прямые ссылки на HashMap - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь десериализовать карту, но в любом случае я получаю эту странную ошибку, есть идеи?

Эта ошибка, которую я получаю:

2020-03-14 04:25:57.913  WARN 18686 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: 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: 183]Object id [3] (for `org.owozniak.selfestem.services.documentation.models.DocWrapper`) at [Source: (PushbackInputStream); line: 1, column: 18].]

Это мой код:

@Data
@Entity
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
public class DocPage {

    @Id
    @GeneratedValue
    Long id;

    @OneToMany(cascade = CascadeType.ALL)
    @JsonSerialize(keyUsing = KeySerializer.class)
    @JsonDeserialize(using = DefinitionDeserializer.class)
    Map<DocWrapper, DocWrapper> nodes = new HashMap<>();
}

И десериализатор

public class DefinitionDeserializer extends JsonDeserializer<Map<DocWrapper, DocWrapper>> {

    @Override
    public Map<DocWrapper, DocWrapper> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        ObjectCodec oc = p.getCodec();
        TreeNode node = oc.readTree(p);

        ObjectMapper mapper = new ObjectMapper();
        Map<String, DocWrapper> o = mapper.convertValue(node, new TypeReference<HashMap<String, DocWrapper>>() {
        });

        Map<DocWrapper, DocWrapper> collect = o.entrySet().stream()
                .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getValue));

        return collect;
    }
}

Модель

@Data
@Entity
@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class DocWrapper {

    @Id
    @GeneratedValue
    Long id;

    @Enumerated(value = EnumType.STRING)
    DocType type;

    @OneToOne(cascade = CascadeType.ALL)
    DocListing listing;

    @OneToOne(cascade = CascadeType.ALL)
    DocDefinition definition;

    public void setListing(DocListing listing) {
        this.listing = listing;
        type = DocType.LIST;
    }

    public void setDefinition(DocDefinition definition) {
        this.definition = definition;
        type = DocType.DEFINITION;
    }

}

Есть идеи, что тут не так?

...