Регистрация пользовательского медиатипа в HATEOAS не работает - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь зарегистрировать медиа-тип "application / vnd.contactdir.v1 + json", но ничего не происходит, и я продолжаю получать не-HAL json.

Вот мой поставщик медиа-типа,

public class ContactDirMediaTypeConfigurationProvider implements MediaTypeConfigurationProvider {

  @Override
  public Class<? extends HypermediaMappingInformation> getConfiguration() {
    return ContactDirMediaTypeConfiguration.class;
  }

  @Override
  public boolean supportsAny(Collection<MediaType> mediaTypes) {
    return true;
  }
}

настройка типа носителя

@Configuration
public class ContactDirMediaTypeConfiguration implements HypermediaMappingInformation {

  @Override
  public List<MediaType> getMediaTypes() {
    return MediaType.parseMediaTypes("application/vnd.contactdir.v1+json");
  }
}

и метод контроллера

 @GetMapping(path = "/contacts",
      produces = {"application/vnd.contactdir.v1+json", "application/hal+json"})
  public ResponseEntity<CollectionModel<ContactDto>> getAllContacts() {
    List<ContactDto> list = contactListService.getAllContacts();
    CollectionModel<ContactDto> collectionModel = linkAppender.appendLinks(list);
    collectionModel.add(
        linkTo(methodOn(ContactListController.class).getAllContacts()).withSelfRel());
    return new ResponseEntity<>(collectionModel, HttpStatus.OK);
  }

Я заметил кое-что странное при выводе списка конвертеров сообщений : некоторые из них повторялись дважды, и у одного был мой тип медиа (с индексом 1). И если во всех из них я установил SupportMediaType для моего типа, json вывод getAllContacts () будет иметь правильный HAL, но я хочу, чтобы регистрация настраиваемого типа работала, как описано в документации . Чего мне не хватает?

ОБНОВЛЕНИЕ 1

После дополнительных исследований я выяснил, что присутствие моего типа в первом TypeConstrainedMapperJackson2HttpMessageConverter дает только правильный результат, но вместе с этим Я полностью запутался.

ОБНОВЛЕНИЕ 2

Теперь я попытался заменить ObjectMapper из первого преобразователя на ObjectMapper из второго, и вывод стал правильным. Похоже, проблема в преобразователе, который поддерживает мой тип носителя. Я изменил его тип конфигурации:

@Configuration
public class ContactDirMediaTypeConfiguration implements HypermediaMappingInformation {

  @Override
  public Module getJacksonModule() {
    return new Jackson2HalModule();
  }

  @Override
  public List<MediaType> getMediaTypes() {
    return MediaType.parseMediaTypes("application/vnd.contactdir.v1+json, application/hal+json");
  }
}

, но все равно ничего. Затем я сравнил (вручную, через отладку, как мог) рабочий маппер с предоставленным выше конфигом и не обнаружил различий. Стоит отметить, что замена сопоставителей работает только в том случае, если добавлено @EnableHyperMediaSupport. В другом случае это не так.

1 Ответ

1 голос
/ 06 апреля 2020

Решением было создать конфигурацию таким образом:

@Configuration
public class ContactDirMediaTypeConfiguration implements HypermediaMappingInformation {

  @Override
  public Module getJacksonModule() {
    return new Jackson2HalModule();
  }

  @Override
  public ObjectMapper configureObjectMapper(ObjectMapper mapper) {

    mapper.registerModule(getJacksonModule());
    mapper.setHandlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(new EvoInflectorLinkRelationProvider(),
        CurieProvider.NONE, MessageResolver.DEFAULTS_ONLY));

    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

    return mapper;
  }

  @Override
  public List<MediaType> getMediaTypes() {
    return MediaType.parseMediaTypes("application/vnd.contactdir.v1+json");
  }
}

Источник: https://github.com/spring-projects/spring-hateoas/issues/1253#issuecomment -608973523

...