Как обеспечить, чтобы application / hal + json был первым поддерживаемым типом мультимедиа - PullRequest
0 голосов
/ 29 мая 2019

Я создал службу Rest с поддержкой Hateoas, используя spring-boot-starter-data-rest, работает хорошо.
Затем я создал клиент этой службы rest в другом модуле весенней загрузки: это зависимость, которая может бытьвключены в другие проекты, которые хотят использовать сервис отдыха.Он использует шаблон отдыха под капотом.Чтобы заставить его работать, потребовалось немного поработать с HttpMessageConverters и TypeConstrainedMappingJackson2HttpMessageConverter.

Я пытался использовать эту зависимость в моем основном приложении, но не удалось заполнить ссылки в ResponseEntity >, что приводит к исключениям нулевого указателя.

Я не смог отследить проблему, поэтому я создал базовое приложение Spring Boot 2.1.5.RELEASE и запустил клиент, а затем отследил проблему до этой конфигурации в моем основном приложении, которое, к сожалению, необходимодругая проблема:

spring:
  main:
    web-application-type: none

Если эта конфигурация присутствует, кажется, что hal + json не является первым принятым типом носителя

org.springframework.core.log.CompositeLog.debug(CompositeLog.java:147) : Accept=[application/json, application/hal+json, application/octet-stream, application/*+json]

Когда конфигурация удалена, я вижу

org.springframework.core.log.CompositeLog.debug(CompositeLog.java:147) : Accept=[application/hal+json, application/json, application/octet-stream, application/*+json]

и я вижу это зарегистрированное, которое решает проблему, которую я предполагаю (это не регистрируется, когда ошибка происходит)

      - @ConditionalOnProperty (spring.hateoas.use-hal-as-default-json-media-type) matched (OnPropertyCondition)

Я попытался добавить эту конфигурацию, чтобы вызвать проблему, но этоне работает

spring:
  hateoas:
    use-hal-as-default-json-media-type: true

Это мой код в остальном клиенте для настройки конвертеров сообщений:

<code>@Configuration
public class MessageConverterConfiguration {

  @Bean public TypeConstrainedMappingJackson2HttpMessageConverter myhalJacksonHttpMessageConverter(){
    return new TypeConstrainedMappingJackson2HttpMessageConverter( ResourceSupport.class );
  }

  /**
   * Add {@link TypeConstrainedMappingJackson2HttpMessageConverter} to the list of {@link HttpMessageConverter}s
   * configured in the {@link  RestTemplate} in first position ( this position  is critical ).
   * @param halJacksonHttpMessageConverter automagically configured by spring-boot-starter-hateoas
   * @return List of {@link HttpMessageConverter}s
   */
  @Bean( name = "hal-jackson" ) public List< HttpMessageConverter<?> > mymessageConverters( TypeConstrainedMappingJackson2HttpMessageConverter halJacksonHttpMessageConverter ) {

    final List<HttpMessageConverter<?>> all = new ArrayList<>(  );
    all.add( halJacksonHttpMessageConverter );
    all.add( jacksonConverterWithOctetStreamSupport( ) );
    all.addAll( new RestTemplate().getMessageConverters() );

    return all;
  }

  /**
   * This allows converting octet stream responses into {@link LastApplicationRun} ,
   * when we create a last run by posting with {@link RestTemplate#postForObject(URI , Object, Class)}
   * : without it we get a
   * <pre>org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter
   * found for response type [class com.sparknz.ced.spark.sampling.rest.tobesampled.client.domain.LastApplicationRun]
   * and content type [application/octet-stream]
.*

* Я не мог найти лучшего решения: оно не нужно, когда мы выполняем вызов get, не понимаю, почему мы получаем ответ потока октетов.* Это может быть только сейчас полезно для тестов.* / private MappingJackson2HttpMessageConverter jacksonConverterWithOctetStreamSupport () {final MappingJackson2HttpMessageConverter converter = новый MappingJackson2HttpMessageConverter ();converter.setSupportedMediaTypes (asList (new MediaType [] {MediaType.valueOf ("application / hal + json"), MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM}));обратный преобразователь;}}

Что такое «тип веб-приложения: нет», и как я могу запустить HypermediaHttpMessageConverterConfiguration?

1 Ответ

0 голосов
/ 30 мая 2019

Я обнаружил, что добавление этого в мой класс конфигурации сделало свое дело: @Import (RepositoryRestMvcConfiguration.class)

RepositoryRestMvcConfiguration, кажется, отвечает за то, чтобы сделать hal + json наивысшим приоритетом, добавив RepositoryRestMvcConfiguration.ResourceSupportHttpMessageв списке HttpMessageConverters.

...