2014-07-24 3 views
18

Questa domanda è correlata a questa domanda SO (Spring boot @ResponseBody doesn't serialize entity id). Ho osservato che dopo la migrazione di un'app in Spring Boot e l'utilizzo della dipendenza spring-boot-starter-data-rest, i miei campi IDI non vengono più sottoposti a marshalling nel JSON risultante.Durante l'utilizzo di Spring Data Rest dopo aver migrato un'app in Spring Boot, ho osservato che le proprietà dell'entità con @Id non vengono più eseguite su JSON

Questa è la mia richiesta di mappatura e durante il debug, posso vedere i dati non vengono modificati prima di restituirlo, quindi le proprietà @Id vengono rimosse in seguito.

@RequestMapping(method = RequestMethod.GET, produces = {"application/json"}) 
public PagedResources<Receipt> receipts(Pageable pageable, PagedResourcesAssembler assembler) { 
    Page<Receipt> receipts = receiptRepository.findByStorerAndCreatedDateGreaterThanEqual("003845", createdStartDate, pageable); 
    PagedResources<Receipt> pagedResources = assembler.toResource(receipts, receiptResourceAssembler); 
    return pagedResources; 
} 

C'è un ambiente che mi permettesse di mantenere il campo @Id in JSON risultante perché la mia applicazione permette all'utente di cercare da quel valore.

Grazie :)

risposta

23

Per impostazione predefinita Primavera Dati resto non sputare ID. Tuttavia è possibile selettivamente attivarlo tramite il metodo exposeIdsFor(..). Si potrebbe fare questo in configurazione, qualcosa di simile

@Configuration 
public static class RepositoryConfig extends 
     RepositoryRestMvcConfiguration { 

    @Override 
    protected void configureRepositoryRestConfiguration(
      RepositoryRestConfiguration config) { 
     config.exposeIdsFor(Class1.class, Class2.class); 
    } 
} 
+3

Dovrebbe essere ha osservato che se si utilizza spring-boot, è necessario estendere 'SpringBootRepositoryRestMvcConfiguration' invece di' RepositoryRestMvcConfiguration' e renderlo una classe normale non una classe statica. – jax

+7

Dalla versione 2.4, il metodo 'configureRepositoryRestConfiguration' deve essere sostituito estendendo la classe' RepositoryRestConfigurerAdapter'. –

+2

E non dimenticare di supportare ora getter e setter per il campo id nella classe entità! .. (l'ho dimenticato e cercavo molto tempo per quello) – flipperweid

16

partire dalla primavera dati Riposo 2.4 (che è una dipendenza transitiva se si utilizza la primavera-boot 1.3.0.M5) si può utilizzare il RepositoryRestConfigurerAdapter. Per esempio,

@Configuration 
class SpringDataRestConfig { 

    @Bean 
    public RepositoryRestConfigurer repositoryRestConfigurer() { 

     return new RepositoryRestConfigurerAdapter() { 
      @Override 
      public void configureRepositoryRestConfiguration(
           RepositoryRestConfiguration config) { 
       config.exposeIdsFor(Class1.class, Class2.class); 
      } 
     } 

    } 

} 
8

Befor esporre Id prega hanno letto di https://github.com/spring-projects/spring-hateoas/issues/66

In REST l'id di una risorsa è la sua URI

https://github.com/spring-projects/spring-hateoas/issues/66#issuecomment-34968272

Il cliente doesn usare esplicitamente l'id per creare un url. Ad esempio, potresti, ad esempio, sostituire il tuo id per un uuid. O anche cambiare lo schema dell'URL.

E qui è campione applicazione del lavoro con ipermedia e collegamenti: https://github.com/spring-projects/spring-hateoas/issues/66#issuecomment-62175087

0

@Id annotazione nella classe del modello fa la magia.

public class Location { 

    @Id 
    private String woeid; 
    private String locationName; 

Allora il vostro oggetto mongo sarà simile a questa:

{ 
    "_id" : "2487889", 
    "_class" : "com.agilisys.weatherdashboard.Location", 
    "locationName" : "San Diego, CA" 
} 
0

messo @getter, @setters e saranno esposti ai risultati JSON, spero che vi aiutano a

Problemi correlati