我不知道如何做应该非常简单的事情。
我有两个实体:书架和书本。一个书架可以有一个或多个书。这些实体中的每个实体都有一个相应的JpaRepository,使用Spring Data Rest可以将其公开为rest仓库。当我运行应用程序时,所有查询端点都能正常工作,但是我不知道如何将书添加到书架上。
首先,我通过将{“ name”:“ westerns”}张贴到/ shelves来添加一个架子(工作正常)。
方法1: 我尝试通过将{“ name”:“ mybook”}张贴到/ shelves / 1 / books来添加一本书,但是出现405错误“方法不允许”。我只能将书发布到/ books端点(我的意思是不编写自己的控制器)吗?如果是这样,我是否必须嵌入该书所属的书架实体?
方法2: 如果我尝试通过使用内容{“ name”:“ westerns”,“ books”:[{“ name”:“ mybook”}]}对/ shelves / 1进行PUT来添加一本书,返回以下错误消息:
消息:“无法读取JSON:模板不能为null或为空!(通过引用链:org.demo.Shelf [“ books”]));嵌套异常为com.fasterxml.jackson.databind.JsonMappingException:模板不得为null或为空(通过引用链:org.demo.Shelf [“ books”])
statcktrace:
2014-11-06 06:55:18.864错误9888 — [nio-8080-exec-5] sdrwAbstractRepositoryRestController:无法读取JSON:模板不能为null或为空!(通过参考chan:org.demo.Shelf [“ books”]);嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException:模板不能为null或为空!(通过参考链:org.demo.Shelf [“ books”]) org.springframework.http.converter.HttpMessageNotReadableException:无法读取JSON:模板不能为null或为空!(通过参考链:org.demo.Shelf [“ books”]);嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:模板不能为null或为空!(通过参考链:org.demo.Shelf [“ books”]),位于org.springframework.http.converter.json.MappingJackson2HttpMessageConverter上的org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228)上。 org.springframework.data.rest.webmvc.config上的readInternal(MappingJackson2HttpMessageConverter.java:212)在org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:159)在org.springframework.data.rest.webmvc.config org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java :)上的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)上的ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 61)at java.lang.Thread.run(Thread.java:745)原因:com.fasterxml.jackson.databind.JsonMappingException:模板不能为null或为空!(通过参考链:org.demo.Shelf [“ books”]),位于com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232)处。 java:197)com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1420)com.fasterxml.jackson.databind.deser.BeanDeserializer处。com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)的com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993)的vanillaDeserialize(BeanDeserializer.java:244) org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:225)的.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158)…省略38个常见框架,原因是:java。 lang.IllegalArgumentException:模板不能为null或为空!在org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module $ UriStringDeserializer上的org.springframework.hateoas.UriTemplate。(UriTemplate.java:56)上的org.springframework.hateoas.UriTemplate。(UriTemplate.java:56)上。
2014-11-06 06:55:18.864错误9888 — [nio-8080-exec-5] sdrwAbstractRepositoryRestController:无法读取JSON:模板不能为null或为空!(通过参考chan:org.demo.Shelf [“ books”]);嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException:模板不能为null或为空!(通过参考链:org.demo.Shelf [“ books”])
org.springframework.http.converter.HttpMessageNotReadableException:无法读取JSON:模板不能为null或为空!(通过参考链:org.demo.Shelf [“ books”]);嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:模板不能为null或为空!(通过参考链:org.demo.Shelf [“ books”]),位于org.springframework.http.converter.json.MappingJackson2HttpMessageConverter上的org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228)上。 org.springframework.data.rest.webmvc.config上的readInternal(MappingJackson2HttpMessageConverter.java:212)在org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:159)在org.springframework.data.rest.webmvc.config org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java :)上的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)上的ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 61)at java.lang.Thread.run(Thread.java:745)原因:com.fasterxml.jackson.databind.JsonMappingException:模板不能为null或为空!(通过参考链:org.demo.Shelf [“ books”]),位于com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232)处。 java:197)com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1420)com.fasterxml.jackson.databind.deser.BeanDeserializer处。com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)的com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993)的vanillaDeserialize(BeanDeserializer.java:244) org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:225)的.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158)…省略38个常见框架,原因是:java。 lang.IllegalArgumentException:模板不能为null或为空!在org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module $ UriStringDeserializer上的org.springframework.hateoas.UriTemplate。(UriTemplate.java:56)上的org.springframework.hateoas.UriTemplate。(UriTemplate.java:56)上。
这是所有相关代码(当然,每个类都在其自己的文件中)。
@Entity public class Shelf { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String name; @OneToMany private List<Book> books; public List<Book> getBooks() { return books; } public void setBooks(List<Book> books) { this.books = books; } public String getName() { return name; } public void setName(String name) { this.name = name; } } @Entity public class Book { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } @RepositoryRestResource public interface BookRepository extends JpaRepository<Book, Long>{ } @RepositoryRestResource public interface ShelfRepository extends JpaRepository<Shelf, Long>{ }
我正在使用Spring Boot 1.1.8.RELEASE
该Book实体拥有自己的REST端点,并创建一个你必须张贴到端点。
Book
要将书放在书架上,您必须将该书的URI发送到关联URI(/shelves/{id}/books)。令人惊讶的是,文档有错误,并且添加项目不是通过POST而是通过PATCH完成:
/shelves/{id}/books
PATCH http://localhost:8080/shelves/1/books Content-Type: text/uri-list http://localhost:8080//books/1
您可以一次添加多本图书,每行一个URI。如果您不想添加书籍,而是将书架上的所有书籍替换为新书籍,即替换整个藏书,则可以使用PUT。