我正在尝试注册媒体类型“ 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时,替换映射器才有效。在其他情况下则不是。
解决方案是以这种方式进行配置:
@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