2015-10-28 7 views
5

Мне нужно предоставить информацию о ограничениях данных или значениях по умолчанию для клиентского приложения, которое будет использовать API. Схема или ALPS, созданная Spring Data Rest, по-видимому, является хорошим местом для размещения этой информации.Spring Data Rest - пользовательский Json Schema/Alps?

Но часть документации по документированию API немного ускорена в официальной справочной документации, и я не могу найти полностью документированный пример в сообществе. Я попытался прочитать код PersistentEntityToJsonSchemaConverter, чтобы получить представление о предлагаемых возможностях, но головная боль пришла в первую очередь.

Я знаю, что есть аннотация @Description, которую я могу наложить на объекты и свойства, которые изменят поле схемы title. Я знаю те же поля могут быть изменены в rest-messages.properties

Есть ли другие поля, которые могут быть изменены аннотациями или файлами конфигурации? Включение информации об умолчании или ограничениях в этом поле описания действительно кажется нецелесообразным.

ответ

3

Вопрос почти старый, я не знаю, нашли ли вы решение.

В любом месте вы можете создать полностью настраиваемую информацию профилирования ALPS, если вы создадите два настраиваемых преобразователя, которые заменяют преобразователи, используемые Spring.

Первым необходимо расширить преобразователь org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter.

Вот возможная реализация:

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; 
    } 

} 

Второй должен расширяет преобразователь org.springframework.data.rest.webmvc.alps.RootResourceInformationToAlpsDescriptorConverter.

У RootResourceInformationToAlpsDescriptorConverter только два открытых ресурса: конструктор и метод «конвертировать».

Вы можете перезаписать каждое отдельное поле/метод этого класса, если вы хотите иметь настраиваемое поведение.

Обратите внимание, что «поддерживает» метод вашего CustomAlpsJsonHttpMessageConverter нужно будет соответствует данному «converterType» с новым CustomAlpsJsonHttpMessageConverter класса.

В этот момент вы можете настроить «преобразовать» метод класса RootResourceInformationToAlpsDescriptorConverter, просто ovverriding его в CustomRootResourceInformationToAlpsDescriptorConverter.

Наконец, вы должны зарегистрировать два преобразователя в контексте приложения. Для этого вы можете расширить класс RepositoryRestMvcConfiguration, а в вашем CustomRepositoryRestMvcConfiguration вам понадобится @Override методы "alpsJsonHttpMessageConverter()" и "alpsConverter()".

Добавить также @Bean аннотацию в двух ovverriding пользовательских методов, например:

@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()); 
} 

Таким образом, вы можете иметь полностью настраиваемой ALPS, если вам нужно.

Я пробовал это решение для создания пользовательских профилирующих ссылок, и он отлично работает.

+0

спасибо! Я больше не работаю над проектом, и мы закончили иметь внешний документ для этого, отрезав «красоту» объясняемого себя API В любом случае, я свяжу ваш ответ с моими бывшими командами, чтобы они поняли о том, что нужно сделать, чтобы вернуться к более чистой документации. –

Смежные вопросы