2015-10-28 21 views
5

È necessario fornire informazioni sui limiti di dati o sui valori predefiniti all'app client che utilizzerà l'API. Lo schema o l'ALPS generato da Spring Data Rest sembra essere un buon posto per mettere queste informazioni.Spring Data Rest - Custom Json Schema/Alps?

Ma la parte relativa alla documentazione dell'API è un po 'veloce nella documentazione di riferimento ufficiale e non riesco a trovare un esempio pienamente documentato nella comunità. Ho provato a leggere il codice PersistentEntityToJsonSchemaConverter per avere un'idea delle possibilità offerte, ma il mal di testa è arrivato prima.

So che c'è l'annotazione @Description che posso inserire su Entità e Proprietà che cambieranno il campo title dello schema. So che gli stessi campi possono essere modificati in rest-messages.properties

Ci sono altri campi che possono essere modificati da annotazioni o file di configurazione? Inserire le informazioni di default o dei vincoli in questo campo di descrizione sembra davvero non utilizzarlo direttamente.

risposta

3

La domanda è quasi vecchia, non so se hai già trovato una soluzione.

Ovunque, è possibile creare un profilo ALPS completamente personalizzato se si creano due convertitori personalizzati che sostituiscono i convertitori utilizzati da Spring.

Il primo deve estendere il convertitore org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter.

Ecco una possibile implementazione:

public class CustomAlpsJsonHttpMessageConverter extends AlpsJsonHttpMessageConverter { 

    public CustomAlpsJsonHttpMessageConverter(RootResourceInformationToAlpsDescriptorConverter converter) { 
     super(converter); 
    } 

    @Override 
    public boolean canWrite(Class<?> clazz, MediaType mediaType) { 
     return super.canWrite(clazz, mediaType); 
    } 

    @Override 
    public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) { 
     return super.canRead(type, contextClass, mediaType); 
    } 

    @Override 
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, 
      Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, 
      ServerHttpResponse response) { 
     return super.beforeBodyWrite(body, returnType, selectedContentType, selectedConverterType, request, response); 
    } 

    @Override 
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { 
     if (converterType.equals(AlpsJsonHttpMessageConverter.class)) 
      return true; 
     else if (converterType.equals(CustomAlpsJsonHttpMessageConverter.class)) 
      return true; 
     else return false; 
    } 

} 

Il secondo bisogna estende convertitore org.springframework.data.rest.webmvc.alps.RootResourceInformationToAlpsDescriptorConverter.

Il RootResourceInformationToAlpsDescriptorConverter ha solo due risorse pubbliche: il costruttore e il metodo "convert".

È possibile sovrascrivere ogni singolo campo/metodo privato di tale classe se si desidera avere un comportamento personalizzato.

Prestare attenzione che il "supporta" il metodo della vostra CustomAlpsJsonHttpMessageConverter dovrà corrisponda alla data "converterType" con il vostro nuovo CustomAlpsJsonHttpMessageConverter classe.

A quel punto è possibile personalizzare il metodo di"conversione" della classe RootResourceInformationToAlpsDescriptorConverter, semplicemente ovverriding nel vostro CustomRootResourceInformationToAlpsDescriptorConverter.

Infine, è necessario registrare i due convertitori nel contesto dell'applicazione. Per fare ciò, puoi estendere la classe RepositoryRestMvcConfiguration e nel tuo CustomRepositoryRestMvcConfiguration dovrai utilizzare i metodi "alpsJsonHttpMessageConverter()" e "alpsConverter()".

Add anche il @Bean annotazione nei due ovverriding metodi personalizzati, in questo modo:

@Bean 
@Override 
public AlpsJsonHttpMessageConverter alpsJsonHttpMessageConverter() { 
    return new CustomAlpsJsonHttpMessageConverter(alpsConverter()); 
} 

@Bean 
@Override 
public RootResourceInformationToAlpsDescriptorConverter alpsConverter() { 
    Repositories repositories = repositories(); 
    PersistentEntities persistentEntities = persistentEntities(); 
    RepositoryEntityLinks entityLinks = entityLinks(); 
    MessageSourceAccessor messageSourceAccessor = resourceDescriptionMessageSourceAccessor(); 
    RepositoryRestConfiguration config = config(); 
    ResourceMappings resourceMappings = resourceMappings(); 

    return new CustomRootResourceInformationToAlpsDescriptorConverter(associationLinks(), repositories, persistentEntities, 
      entityLinks, messageSourceAccessor, config, objectMapper(), enumTranslator()); 
} 

Così si può avere un ALPS completamente personalizzato, se è necessario.

Ho provato questa soluzione per creare collegamenti di profilazione personalizzati e funziona perfettamente.

+0

grazie! Non lavoro più sul progetto, e abbiamo finito con un documento esterno per questo, tagliando la "bellezza" dell'API auto spiegata In ogni caso, collegherò la tua risposta ai miei ex teamati per farli avere una visione di cosa fare per tornare alla documentazione più pulita. –