2016-12-06 5 views
4

나는 같은 복잡한 유형을 정의하는 나의 봄 데이터 REST 응용 프로그램에서 롬복을 사용하는 경우 : 스프링 데이터 REST와봄 데이터 REST : "아무 문자열 인수 생성자/팩토리 메소드는 문자열 값에서 역 직렬화 없습니다"

@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; 

    // ... 
} 

컨트롤러는 같은 : 봄 데이터 REST의 사용으로

no String-argument constructor/factory method to deserialize from String value 

:

@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); 
    } 
} 

내가 못생긴 오류 책 POST와 잭슨 좋아 잭슨은 하나의 고유 Person에 해결해야 /people/123 지역 URI를 해결하려고 할 때

curl -X POST 
    -H 'content-type: application/json' 
    -d '{"title":"Skip Like a Pro", "author": "/people/123"}' 
    http://localhost:8080/api/books/ 

탈 직렬화 오류가 발생합니다. @RepositoryRestController을 제거하면 정상적으로 작동합니다. REST 컨트롤러 정의에 어떤 문제가 있습니까? @RepositoryRestController에서

+0

안녕하세요 Jan, 왜 AllArgsConstructor에서 suppressConstructorProperties = true를 사용하고 있습니까? Lombok dosumentation은 다음과 같이 말합니다. 'true로 설정하면 lombok은 @ java.beans.ConstructorProperties를 생성 된 생성자에 추가하지 않습니다. 이것은 안드로이드와 GWT 개발에서 유용하다. 권장 사례에 해당하지 않는 것으로 보입니다. 이 구성을 제거하면 어떻게됩니까? – avi613

+0

Lombock에서 @Data 주석을 확인하십시오. equals 및 해시 코드를 생성합니다. – avi613

+0

@ avi613 - 불행하게도 Jackson의 직렬화 해제로 인해 @AllArgsConstructor (suppressConstructorProperties = true)가없는 위의 오류가 발생합니다. 이는 아마도 Lombok 버그 일 수 있습니다. –

답변

10

BookResource<Book>에에서 @RequestBody 인수의 유형을 변경 :

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을 참조하십시오.

+1

@RepositoryRestResource (Spring-data-rest HATEOAS Resources)로 Repositores를 노출합니다. RepositoryRestController가 없습니다. 하지만 같은 오류가 발생합니다. 어떻게 해결할 수 있습니까? – Robert

+0

@Robert - 잭슨이 데이터를 비 직렬화 할 수없는 동일한 근본적인 문제 일 가능성이 있습니다. 그러나이 솔루션은 귀하의 경우에 따라 다릅니다. 모든 세부 사항을 가진 새로운 질문을 열 것을 제안합니다 ... –

+0

@Robert - Spring REST 참조의 [Domain Object Representations] 섹션을 읽을 수도 있습니다 (http://docs.spring.io/spring-data/). rest/docs/current/reference/html/# 표현). –