在HATEOAS中注册自定义媒体类型不起作用

问题描述 投票:0回答:1

我正在尝试注册媒体类型“ 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);
  }

我在输出the list of message converters时发现了一些奇怪的现象:其中一些重复了两次,其中一个具有我的媒体类型(索引为1)。而且,如果我在所有类型中均将supportedMediaType设置为我的类型,则getAllContacts()的json输出将具有正确的HAL,但我希望自定义类型注册能够按the documentation中所述进行工作。我想念什么?

UPDATE 1

经过更多研究,我发现我的类型在第一个TypeConstrainedMapperJackson2HttpMessageConverter中的存在只会给出正确的结果,但与此同时,我完全感到困惑。

UPDATE 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时,替换映射器才有效。在其他情况下则不是。

java spring spring-boot spring-hateoas
1个回答
0
投票

解决方案是以这种方式进行配置:

@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

© www.soinside.com 2019 - 2024. All rights reserved.