java - Spring 数据 REST : "no String-argument constructor/factory method to deserialize from String value"

标签 java spring java-8 spring-data-rest lombok

当我在 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 Controller ,例如:

@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 尝试解析 /people/123 本地 URI 时,该 URI 应该解析为单个唯一的 Person。如果我删除我的 @RepositoryRestController,一切正常。知道我的 REST Controller 定义有什么问题吗?

最佳答案

@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()
        // ...
    }

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

参见 Spring Data REST #687获取更多信息。

关于java - Spring 数据 REST : "no String-argument constructor/factory method to deserialize from String value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40986738/

相关文章:

java - 我可以将 @ComponentScan 和 @Autowired 与 BasicDataSource 一起使用,而无需在 XML 中为 BasicDataSource 类声明 bean 吗?

java - java中如何实现二维数组?

Java 8 : Idiomatically creating a Comparator for ordering objects based on their index in a List

java - 找不到生成的 .keystore 文件

javascript - 刷新 JSP 变量而不重新加载页面

java - BCEL == monkeypatching for java 吗?

java - 有效地将oracle表数据缓存到 Elasticsearch 数据库中

java - Spring/Junit 访问兄弟类

Java 8 消费者/函数 Lambda 歧义

java - Stream.sorted().limit() 的性能