Spring Data REST:"没有String-argument构造函数/工厂方法从String值反序列化"

Jan*_*sen 4 java spring lombok java-8 spring-data-rest

当我在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;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个丑陋的错误:

no String-argument constructor/factory method to deserialize from String value
Run Code Online (Sandbox Code Playgroud)

从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/
Run Code Online (Sandbox Code Playgroud)

当Jackson尝试解析/people/123应解析为单个唯一的本地URI时,会发生反序列化错误Person.如果我删除我的@RepositoryRestController,一切正常.知道我的REST控制器定义有什么问题吗?

Jan*_*sen 11

@RepositoryRestController,将@RequestBody参数的类型更改Book Resource<Book>:

import org.springframework.hateoas.Resource;

    // ...

    @RequestMapping(method = RequestMethod.POST,value = "/books")
    public @ResponseBody PersistentEntityResource post(
        @RequestBody Resource<Book> bookResource,             // Resource<Book>
        PersistentEntityResourceAssembler assembler) {

        Book book = bookResource.getContent()
        // ...
    }
Run Code Online (Sandbox Code Playgroud)

并在Book实体定义中将AllArgsConstructor注释修改为:@AllArgsConstructor(suppressConstructorProperties = true).

有关更多信息,请参阅Spring Data REST#687.

  • 我用@RepositoryRestResource公开我的Repositores(作为spring-data-rest HATEOAS资源)我没有任何RepositoryRestController.但我得到了同样的错误.我该如何解决这个问题? (2认同)
  • @Robert——您还可以阅读 [Spring REST 参考中的域对象表示部分](http://docs.spring.io/spring-data/rest/docs/current/reference/html/#representations)。 (2认同)