【发布时间】:2017-04-20 13:59:32
【问题描述】:
当我在 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 的本地 URI /people/123 时,会发生反序列化错误。如果我删除我的@RepositoryRestController,一切正常。知道我的 REST 控制器定义有什么问题吗?
【问题讨论】:
-
嗨 Jan,你为什么在 AllArgsConstructor 中使用 suppressConstructorProperties = true ? Lombok dosumentation 说:'如果设置为 true,则 lombok 将跳过将 @java.beans.ConstructorProperties 添加到生成的构造函数。这在注释通常不可用的 android 和 GWT 开发中很有用。看来您不属于推荐的情况。如果删除此配置会怎样?
-
请检查 Lombok 中的 @Data 注释。它生成等号和哈希码。
-
@avi613 -- 不幸的是,Jackson 的反序列化在没有
@AllArgsConstructor(suppressConstructorProperties = true)的情况下触发了上述错误 -- 这可能是 Lombok 错误。
标签: java spring java-8 spring-data-rest lombok