Использование JacksonYAMLProvider
в вашем JAX-RS Client
У Джексона есть модуль для обработки сериализации / десериализации YAML в JAX-RS.Он предоставляет MessageBodyReader
и MessageBodyWriter
, необходимые для привязки содержимого YAML к объектам Java и из них.Чтобы использовать его, добавьте в свой проект следующую зависимость:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-yaml-provider</artifactId>
<version>2.9.7</version>
</dependency>
Затем зарегистрируйте класс JacksonYAMLProvider
и выполните ваш запрос следующим образом:
Client client = ClientBuilder.newClient().register(new JacksonYAMLProvider());
Response response = client.target("http://example.org")
.request().accept(YAMLMediaTypes.APPLICATION_JACKSON_YAML)
.post(Entity.entity(foo, YAMLMediaTypes.APPLICATION_JACKSON_YAML_TYPE));
Где foo
- это объект, который будет сериализован как YAML.
Если вам необходимо настроить сериализацию / десериализацию YAML, вы можете передать экземпляр YAMLMapper
конструктору JacksonYAMLProvider
:
YAMLMapper mapper = new YAMLMapper();
mapper.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
Client client = ClientBuilder.newClient().register(new JacksonYAMLProvider(mapper));
Как только для IAML не зарегистрирован тип носителя, зарегистрированный в IANA , официального стандарта не существует.Тип носителя YAML, используемый Джексоном, - application/yaml
.Например, если вам нужно использовать application/x-yml
, вы можете переопределить метод hasMatchingMediaType()
из JacksonYAMLProvider
в соответствии с вашими потребностями:
JacksonYAMLProvider jacksonYAMLProvider = new JacksonYAMLProvider() {
@Override
protected boolean hasMatchingMediaType(MediaType mediaType) {
return super.hasMatchingMediaType(mediaType) ||
"x-yml".equalsIgnoreCase(mediaType.getSubtype());
}
};
Client client = ClientBuilder.newClient().register(jacksonYAMLProvider);
Используя YAMLMapper
напрямую
В качестве альтернативы, вы могли бы использовать подход, показанный ниже, который не зависит от провайдера Jackson YAML для JAX-RS.
YAMLMapper mapper = new YAMLMapper();
Client client = ClientBuilder.newClient();
Response response = client.target("http://example.org")
.request().accept("application/x-yml")
.post(Entity.entity(mapper.writeValueAsString(foo), "application/x-yml"));
В этом подходе foo
сериализуется как YAML с использованием YAMLMapper
напрямую.