2017-07-17 1 views
1

Je souhaite utiliser Spring Data Rest dans mon projet Spring Boot mais je rencontre des difficultés. J'utilise Spring boot version 2.0.0.M2. J'ai aussi essayé la version 1.5.4.RELEASE mais ai eu la même erreurRessort de démarrage et de repos de données de ressort

J'utilise les importations suivantes dans mon pom

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
     <exclusions> 
      <exclusion> 
       <groupId>org.apache.tomcat</groupId> 
       <artifactId>tomcat-jdbc</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-rest</artifactId> 
    </dependency> 

Mon objet DB est la suivante

@Entity 
@Table(name = "T_PUBLICATION") 
public class PublicationDBO implements Serializable{ 

    private static final long serialVersionUID = -8883649751668748295L; 

    @Id 
    @Column(name = "id") 
    private Long id;  
    @Column(name = "publication_name") 
    private String publicationName; 
    @Column(name = "number_of_pages") 
    private Long numberOfPages; 
    @Column(name = "storage_key") 
    private String storageKey; 
    @Column(name = "processing_complete") 
    private Boolean processingComplete; 
    @Column(name = "date_added") 
    private LocalDateTime dateAdded;  
    @Column(name = "date_updated") 
    private LocalDateTime dateUpdated; 

} 

base de données SQL (MySQL DB)

CREATE TABLE `T_PUBLICATION` (
    `id` int(11) NOT NULL, 
    `publication_name` varchar(255) NOT NULL, 
    `number_of_pages` int(11) NOT NULL, 
    `storage_key` varchar(255) NOT NULL, 
    `processing_complete` tinyint(1) NOT NULL, 
    `date_added` datetime NOT NULL, 
    `date_updated` datetime NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

classe Repository

import org.springframework.data.repository.PagingAndSortingRepository; 
import org.springframework.data.rest.core.annotation.RepositoryRestResource; 

import com.dao.vo.PublicationDBO; 

@RepositoryRestResource(collectionResourceRel = "publication", path = "publication") 
public interface PublicationRepository extends PagingAndSortingRepository<PublicationDBO, Long>{ 

} 

Lorsque j'ai essayé d'accéder aux points d'extrémité pour les données Spring et cet objet - je reçois l'erreur suivante

2017-07-17 16:03:28 [http-nio-8080-exec-1] DEBUG org.hibernate.SQL - select publicatio0_.id as id1_1_0_, publicatio0_.date_added as date_add2_1_0_, publicatio0_.date_updated as date_upd3_1_0_, publicatio0_.number_of_pages as number_o4_1_0_, publicatio0_.processing_complete as processi5_1_0_, publicatio0_.publication_name as publicat6_1_0_, publicatio0_.storage_key as storage_7_1_0_ from T_PUBLICATION publicatio0_ where publicatio0_.id=? 
Hibernate: select publicatio0_.id as id1_1_0_, publicatio0_.date_added as date_add2_1_0_, publicatio0_.date_updated as date_upd3_1_0_, publicatio0_.number_of_pages as number_o4_1_0_, publicatio0_.processing_complete as processi5_1_0_, publicatio0_.publication_name as publicat6_1_0_, publicatio0_.storage_key as storage_7_1_0_ from T_PUBLICATION publicatio0_ where publicatio0_.id=? 
2017-07-17 16:03:28 [http-nio-8080-exec-1] WARN o.s.w.s.m.s.DefaultHandlerExceptionResolver - Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: java.lang.String cannot be cast to java.lang.Long; nested exception is com.fasterxml.jackson.databind.JsonMappingException: java.lang.String cannot be cast to java.lang.Long (through reference chain: org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module$PersistentEntityResourceSerializer$1["content"]->com.dao.vo.PublicationDBO["publicationName"]) 
2017-07-17 16:03:28 [http-nio-8080-exec-1] WARN o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolved exception caused by Handler execution: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: java.lang.String cannot be cast to java.lang.Long; nested exception is com.fasterxml.jackson.databind.JsonMappingException: java.lang.String cannot be cast to java.lang.Long (through reference chain: org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module$PersistentEntityResourceSerializer$1["content"]->com.dao.vo.PublicationDBO["publicationName"]) 

Note: J'ai essayé l'Assemblée parlementaire paritaire appelle à l'aide d'une classe de service standard et ils ont travaillé d'abord temps pour que l'entité mappant à mes tables de base de données est correcte

Quelqu'un peut-il offrir une assistance sur pourquoi cela se produit? J'ai vérifié mes applications de base de données et ils semblent être ok

Merci Damien

+0

'java.lang.String ne peut pas être jeté à java.lang .Long' les données que vous envoyez sont incorrectes. – EpicPandaForce

+0

Oui, mais les données de printemps devraient prendre soin de cela. J'ai la même configuration avec un objet DB simple et ça marche bien – Damien

+0

Spring-data ne s'occupera pas de vous envoyer une chaîne à un champ Long, ou vice versa. – EpicPandaForce

Répondre

1

Je pense que vous n'envoyez « id » dans le cadre de votre JSON. Vous avez probablement supposé que id est créé automatiquement, et supposé que vous n'avez pas à envoyer. Si c'est le cas (c'est-à-dire que vous ne voulez pas envoyer d'identifiant dans votre objet JSON), ajoutez @JsonIgnore à id dans votre définition d'entité. Si vous le faites, vous n'obtiendrez pas le champ Id inclus dans l'objet de retour lorsque vous interrogez également. Si vous voulez id, envoyez une valeur nulle ou "" (chaîne vide) dans votre JSON. Parfois, le démarrage de Spring peut ignorer ces champs vides. Il devrait y avoir une autre annotation @Json ... pour lui indiquer de ne pas ignorer les valeurs nulles/vides. Je ne pouvais pas l'avoir au sommet de la tête, vous devez le faire.

+0

Cette annotation est @JsonIgnoreProperties (ignoreUnknown = true) - malheureusement il n'y a pas de changement - même résultat – Damien