2017-09-04 27 views
0

Dans mon projet, j'ai 2 entités. Enquête et entrées à enquêter. Ils sont en relation un à plusieurs (thare peut être plusieurs entrées à une enquête). Spring Data Rest & Lombok - Exception lors de l'ajout d'une relation d'ajout

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

} 

J'ai également créé 2 dépôts de repos à l'aide de repos de données Spring:

@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> { 
} 

J'ai enquête ajouté avec succès par la demande reste POST et je peux accéder entrées (actuellement vide) en envoyant GET à /api/surveys/1/entries. Maintenant je veux ajouter l'entrée à l'enquête existante. Et tandis que je peux l'ajouter en envoyant POST (contenu ci-dessous) à /api/survey-entries j'ai des problèmes en l'ajoutant directement comme une référence à l'enquête. J'utilise la méthode POST avec le même contenu et l'adresse /api/surveys/1/entries. Ce qui est intéressant, je reçois NullPointerException dans les journaux et l'entrée n'est pas insérée mais l'horodatage de modification d'audit dans l'enquête est modifié. Qu'est-ce que je fais mal? Ai-je manqué la même configuration? Ou devrais-je utiliser un contenu différent?

Contenu du POST avec l'entrée:

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

Contenu du POST enquête:

{ 
    "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

J'ai essayé d'ajouter l'entrée par la poste à /api/survey-entries avec application/hal + JSON 'en-tête Content-Type et le contenu comme ci-dessous, mais maintenant je reçois autre exception:

Contenu:

{  
    "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

Ajouté Lombok annotations présentes o n Entité de classe

+0

Afficher vos charges utiles de toutes les demandes, plz – Cepr0

+0

J'ai ajouté le corps de POST avec enquête, mais ça fonctionne très bien, donc je ne pense pas que cela a quelque chose à voir avec mon problème. – Dcortez

+1

Voir ma réponse dans un autre sujet: https://stackoverflow.com/a/46025434 – Cepr0

Répondre

1

Malheureusement, le problème résidait dans les annotations Lombok qui n'étaient pas incluses dans l'exemple de code. Je les ai ajoutés maintenant afin que tout le monde puisse voir où se situe le problème.

J'ai réussi à le résoudre en déclassant Lombok à la version (1.16.14) et en changeant l'annotation @AllArgsConstructor à @AllArgsConstructor(suppressConstructorProperties = true). Il est impossible de réaliser dans les versions ultérieures de Lombok car cette propriété est actuellement supprimée.

J'ai trouvé une solution sur Spring Data Rest JIRA. Il existe déjà le numéro DATAREST-884 mentionnant le problème et présentant la solution/solution de contournement.

Désolé pour la perte de temps alors qu'il était impossible de voir la solution sans tout le code.

+0

Avez-vous vu cette info? https://projectlombok.org/features/configuration 'lombok.anyConstructor.suppressConstructorProperties Si vrai, lombok ne générera pas d'annotation @ java.beans.ConstructorProperties lors de la génération de constructeurs. Ceci est particulièrement utile pour le développement de GWT et Android. » – Cepr0

+0

Oui, mais je ne l'ai pas connecté avec mon cas d'utilisation. Il semble que cette annotation rende les entités incapables de désérialiser l'uri. Mais pourquoi cela arrive est un mystère pour moi. Maintenant, quand ce param est maintenant retiré de Lombok, je considère mon cas d'utilisation comme un problème qui devrait être résolu d'une manière ou d'une autre sans avoir besoin de rétrograder les dépendances. – Dcortez