2015-11-05 9 views
5

Attualmente sto lavorando su un POC per Spring Data Rest. Cercando di ottenere JSONout realizzabile di un repository.Errore di Spring Data Rest (SDR)? Entità persistente Non deve essere nulla

ho una classe di entità (NewTask)

@Entity 
@Table(name="newtable") 
public class NewTask { 

    @Id 
    @Column(name="newid") 
    private int id; 


    @Column(name="newage") 
    private int age; 

    @Column(name="newaddress") 
    private String address; 



    public String getAddress() { 
     return address; 
    } 
    public void setAddress(String address) { 
     this.address = address; 
    } 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public int getAge() { 
     return age; 
    } 
    public void setAge(int age) { 
     this.age = age; 
    } 

} 

e un corrispondente repository ..

@RepositoryRestResource 
    @PreAuthorize("hasRole('ROLE_ADMIN')") 
    public interface NewTaskRepository extends CrudRepository<NewTask, Serializable>{ 


     @Query("SELECT t.address FROM NewTask t where t.id = :id") 
     String findByMyId(@Param("id") int id); 

     }   

ogni volta che mi ha colpito

http://localhost:8080/POCDB/newTasks/search/findByMyId?id=1 

ottengo il seguente errore: { "causa": null, "messaggio": "PersistentEntity non deve essere nullo!"}

Ora ecco come appare il mio repository: Si prega di leggere i commenti su ciascun metodo

//Gives- PersistentEntity must not be null!!! 
    @Query("SELECT t.address FROM NewTask t where t.id = :id") 
    String findByMyId(@Param("id") int id); 


    //WORKS FINE 
    @Query("SELECT t.id FROM NewTask t where t.id = :id") 
    int findId(@Param("id") int id); 


    //WORKS FINE 
    @Query("SELECT t.id FROM NewTask t where t.id = :id") 
    Integer findIdTwo(@Param("id") int id); 

    //Gives- PersistentEntity must not be null!!! 
    @Query("SELECT t.id FROM NewTask t") 
    List<Integer> findIds(); 

Non sono sicuro di quali sono i problemi con ritorno types.I cui sul link qui sotto per qualche soluzione:

How does one create a custom query in jparepository but return an object other than the entity?

e ha aggiunto altri 2 metodi per il mio repository, che non lavorano per me

// returns in some weird format 
    @Query("SELECT t.address FROM NewTask t where t.id = :id") 
    PString findByMyId(@Param("id") int id); 

    //Gives- PersistentEntity must not be null!!! 
    @Query("SELECT t.address FROM NewTask t") 
    List<PString> findAddress(); 

Ho l'impressione che si tratti di un errore in SDR o manco qualcosa?

+0

Domanda duplicata. http://stackoverflow.com/a/30403914/621686 – bvulaj

+0

Ciao Brandon, La risposta che hai postato non funziona nel mio caso. Inoltre, questo non è un problema di ereditarietà, non esiste una classe base, ma il messaggio di errore è lo stesso. Potete aiutarmi per favore con la soluzione se avete qualche idea? O puoi riferire qualcuno che può? –

risposta

6

Spring Data REST può solo restituire i dati per i quali il repository è registrato. Nell'altra domanda a cui fai riferimento, noterai che hanno creato un repository personalizzato appositamente per il tipo di cui avevano bisogno. Questo non è un bug in SDR, è solo come funziona. Lo mantiene anche RESTful.

Quindi nel tuo caso, SDR può restituire solo NewTask o raccolte di NewTask.

+1

Sì, ho capito quella parte, ma come vedi nella domanda sopra, perché non genera lo stesso errore quando restituisco un intero? –

+0

Ho un problema molto simile quando restituisco un attributo enum di un'entità: '@Query ("seleziona d.status da Deal as d where d.id =: id") Deal.Status findStatusById (@Param ("id") Id lungo); ' Capisco, che il riposo dei dati primaverili non dovrebbe restituire altro che risorse, ma perché va bene? D'altra parte, se voglio escludere questa query dall'essere esposta a spring-data-rest, come sarebbe possibile? – Gregor

+0

Un int è accettabile perché si presume che sia un id di una risorsa (annotazione @Id su un campo int). – afaulconbridge

0

In Spring Boot, se l'applicazione principale Spring non è riuscita a scansionare le classi POJO, questo errore verrà generato a meno che non si inseriscano tutte le classi nello stesso pacchetto. Quindi aggiungi l'annotazione di scansione dei componenti sopra la principale classe di applicazione Spring

@ComponentScan(basePackages = "com.aaa.bbbb.ccccc")