Java Webclient: Как сериализовать до Pascal JSON? - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь взаимодействовать с другой системой, которая имеет чрезвычайно определенные c параметры интеграции. У них нет какого-либо кода, написанного для игнорирования чувствительности к регистру, и, короче говоря, для пост-запроса, который я пытаюсь сделать, они ожидают тело JSON с именами полей в Pascal случае вместо Camel Case и запрос не выполняется без Pascal. Мы используем WebClient для отправки вызовов интеграции, чтобы мы могли поддерживать реактивные потоки в нашем коде. Насколько я могу сказать, когда я использую WebClient для сериализации в JSON, запрос преобразуется в использование Camel Case, чего я обычно хотел бы.

Как я могу сериализовать это для Pascal вместо? Все, что я пытаюсь исследовать, приводит к тому, что я попадаю на NET землю, но я не пишу это в C#. Я пишу это в Java.

//For example:
{"originTypeCode":"US","camelCaseFieldName":"FAILED"}     // FAILURE
{"OriginTypeCode":"US","PascalFieldName":"SUCCESS"}       // SUCCESS

У меня есть две идеи:

1) Это кажется менее идеальным, но, возможно, более интуитивным. Идея состоит в том, чтобы сначала преобразовать объект, который я пытаюсь опубликовать, в JSON, затем с помощью парсера преобразовать все поля из Camel Case в Pascal, а затем попытаться опубликовать его с помощью моего метода WebClient. Это не самый идеальный способ сделать это. Я мог бы предположить, что, возможно, есть что-то намного чище.

2) Вторая идея заключается в том, что мой экземпляр WebClient сериализуется с использованием сериализатора Джексона. Я думаю, что если бы мне пришлось создать новый Bean-компонент WebClient / Jackson ObjectMapper, возможно, я мог бы написать собственный конвертер для использования специально для этого потока интеграции. Кажется, что это, возможно, чище, но копаясь в WebClient и его методах сборки, трудно понять, как это сделать sh. Ниже я публикую бобы, как они у меня определены. Копаться в такого рода вещах довольно ново для меня, поэтому я не уверен, что нужно изменить или где. Компонент WebClient из класса WebClientConfig, а объект ObjectMapper из моего класса JacksonConfig.

@Bean
public WebClient webClient() {
    return WebClient.builder().clientConnector(getClientHttpConnector()).build();
}

@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.createXmlMapper(false).build();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    return objectMapper;
}

Я также открыт для других предложений.

1 Ответ

1 голос
/ 05 марта 2020

Комментарии @GriffeyDog помогли мне понять, что мне нужно делать. Для любого, кто сталкивается с этим, решение было следующим:

Если вы хотите, чтобы определенные классы сериализовались указанными c способами, вы можете аннотировать сам класс аннотацией @JsonNaming, а затем указывать наименование Стратегия, список которой можно найти здесь: https://java-focus.com/jackson-property-naming-strategy/. Для моего случая использования я использовал PropertyNamingStrategy.UpperCamelCaseStrategy.

@JsonNaming(value = PropertyNamingStrategy.UpperCamelCaseStrategy.class)
public class MyPascalSerializedClass {}
//All fields in this class will serialize to "UpperCamelCase" instead of "normalCamelCase".

Кроме того, если вы хотите указать определенные поля, вы можете использовать аннотацию @JsonProperty для переопределения даже аннотации класса. Например, в моем классе было поле, которое должно было отображаться в формате JSON, который не соответствовал ни одному стандартному соглашению, поэтому я смог использовать это.

@JsonProperty("ULDNumber")
private String uldNumber
//This field will serialize to the specified "ULDNumber".

Это все часть библиотеки com.faster xml .jackson. Для дальнейшей документации вы можете обратиться к ссылке выше и следующим: https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/PropertyNamingStrategy.UpperCamelCaseStrategy.html

...