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.
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. –