SPRING-HATEOAS + RestTemplate: создание ресурсов со связанными сущностями?

Как создать ресурсы с непосредственными отношениями к существующим объектам? Возьмите простой случай пользователя форума. У нас есть два ресурса верхнего уровня, которые могут существовать независимо друг от друга: пользователь и вопрос. Если бы вы опубликовали свой JSON буквально, вы бы отправили что-то вроде:

POST /api/users
{name: "John Doe", "email": "jdoe@example.com"}

и получить обратно заголовок местоположения: Jeff Atwood

затем

POST /api/questions
{"author": "http://example.com/api/users/1", "title": "How to do this?", "text": "I don't know how to do this..."}

С RestTemplate я бы соблазнился сделать:

Question q = new Question();
q.author = somePreviouslyCreatedUSerReference;
q...

template.getForLocation("/api/questions", q);

Но вы получите следующую ошибку, поскольку десериализатор ожидает ссылку. Существует много документации по использованию тривиальных конечных точек REST, но очень скудной, когда речь идет о создании реальных ресурсов.


Caused by: com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.example.model.Question["author"])
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232)
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:197)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1420)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:244)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:225)
    ... 39 common frames omitted
Caused by: java.lang.NullPointerException: null
    at java.net.URI$Parser.parse(URI.java:3023)
    at java.net.URI.<init>(URI.java:595)
    at java.net.URI.create(URI.java:857)
    at org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module$UriStringDeserializer.deserialize(PersistentEntityJackson2Module.java:359)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:525)
    at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:106)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:242)
    ... 43 common frames omitted

0 ответов

Другие вопросы по тегам