Spring Data REST:“没有String-argument构造函数/工厂方法从String值反序列化”
当我在Spring Data REST应用程序中使用Lombok来定义复杂类型时:
@NoArgsConstructor @AllArgsConstructor @Data @Entity @Table(name = "BOOK") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(nullable = false) private Long id; private String title; @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) private Person author; // ... }
使用Spring Data REST控制器,例如:
@RepositoryRestController public class BookRepositoryRestController { private final BookRepository repository; @Autowired public BookRepositoryRestController(BookRepository repository) { this.repository = repository; } @RequestMapping(method = RequestMethod.POST,value = "/books") public @ResponseBody PersistentEntityResource post( @RequestBody Book book, PersistentEntityResourceAssembler assembler) { Book entity = processPost(book); return assembler.toResource(entity); } private Book processPost(Book book) { // ... return this.repository.save(book); } }
我收到一个丑陋的错误:
no String-argument constructor/factory method to deserialize from String value
从Spring Data REST中使用Jackson与Book POST一样:
curl -X POST -H 'content-type: application/json' -d '{"title":"Skip Like a Pro", "author": "/people/123"}' http://localhost:8080/api/books/
当Jackson尝试解析应该解析为单个唯一Person
的/people/123
本地URI时,会发生反序列化错误。 如果我删除我的@RepositoryRestController
,一切正常。 知道我的REST控制器定义有什么问题吗?
在@RepositoryRestController
,将@RequestBody
参数的类型从Book
更改为Resource
:
import org.springframework.hateoas.Resource; // ... @RequestMapping(method = RequestMethod.POST,value = "/books") public @ResponseBody PersistentEntityResource post( @RequestBody Resource bookResource, // Resource PersistentEntityResourceAssembler assembler) { Book book = bookResource.getContent() // ... }
并在Book
实体定义中将AllArgsConstructor
注释修改为: @AllArgsConstructor(suppressConstructorProperties = true)
。
有关更多信息,请参阅Spring Data REST#687 。