Dcortez
Dcortez

Reputation: 4238

Spring Data Rest & Lombok - Exception while adding adding relation

In my project I have 2 entities. Survey and entries to survey. They are in relation one to many (thare can be many entries to one survey).

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "survey_entries")
@TypeDef(name = "SurveyEntry", typeClass = SurveyEntry.class)
public class SurveyEntryEntity extends AbstractEntity {

    @ManyToOne
    @JoinColumn(name = "survey_id")
    private SurveyEntity survey;

    @NonNull
    @Type(type = "SurveyEntry")
    @Column(name = "responses")
    // JSON db column type mapped to custom type
    private SurveyEntry responses;
}
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "surveys")
@TypeDef(name = "Survey", typeClass = Survey.class)
public class SurveyEntity extends AbstractEntity {

    @NonNull
    @Type(type = "Survey")
    @Column(name = "template")
    // JSON db column type mapped to custom type
    private Survey survey;

    @OneToMany(mappedBy = "survey")
    private List<SurveyEntryEntity> entries;

}

I have also created 2 rest repositories using Spring Data Rest:

@RepositoryRestResource(collectionResourceRel = "survey_entries", path = "survey-entries")
public interface SurveyEntryRepository extends PagingAndSortingRepository<SurveyEntryEntity, Long> {
}
@RepositoryRestResource(collectionResourceRel = "surveys", path = "surveys")
public interface SurveyRepository extends PagingAndSortingRepository<SurveyEntity,Long> {
}

I have successfully added survey by rest POST request and I can access it entries (currently empty) by sending GET to /api/surveys/1/entries.Now I want to add entry to exisiting survey. And while I can add it by sending POST (content below) to /api/survey-entries I have troubles adding it directly as a reference to survey. I'm using POST method with the same content and url /api/surveys/1/entries. What is interesting, I'm getting NullPointerException in logs and entry is not inserted but audit modify timestamp in survey is changed. What am I doing wrong? Did I miss same configuration? Or should I use different content?

Content of POST with entry:

{      
  "responses": {          
    "question1": "response1",          
    "question2": "response2",          
    "question3": "response3"      
  }  
}

Content of POST with survey:

{
    "survey": {
        //survey structure
    }
}

Exception:

08:41:14.730 [http-nio-8080-exec-3] DEBUG org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod - Failed to resolve argument 1 of type 'org.springframework.data.rest.webmvc.PersistentEntityResource'
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: No content to map due to end-of-input; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input

@EDIT

I have tried adding entry by POST to /api/survey-entries with 'application/hal+json' Content-Type header and content as below, but now I'm getting other exception:

Content:

{      
  "survey" : "http://localhost:8080/api/surveys/1",
  "responses": {          
    "question1": "response1",          
    "question2": "response2",          
    "question3": "response3"      
  }  
}

Exception:

Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.domain.SurveyEntity` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('http://localhost:8080/api/surveys/1')
 at [Source: (org.apache.catalina.connector.CoyoteInputStream); line: 1, column: 41] (through reference chain: com.domain.SurveyEntryEntity["survey"])

@Edit 2

Added Lombok annotations present on Entity classess

Upvotes: 0

Views: 1738

Answers (1)

Dcortez
Dcortez

Reputation: 4238

Unfortunatelly problem lied in Lombok annotations which weren't included in sample code. I added them now so any one can see where the problem lies.

I managed to solve it by downgrading Lombok to version (1.16.14) and changing annotation @AllArgsConstructor to @AllArgsConstructor(suppressConstructorProperties = true). It's immposible to achieve in later Lombok versions as this property is currently removed.

I have found solution on Spring Data Rest JIRA. There is already issue DATAREST-884 mentioning problem and presenting solution/workaround.

Sorry for wasted time while it was impossible to see solution without all the code.

Upvotes: 1

Related Questions