Разница в ответе JSON в Spring Boot v3 и v4JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Разница в ответе JSON в Spring Boot v3 и v4

Сообщение Anonymous »

Я переношу Spring Boot REST API версии 3.x в новую версию 4 и замечаю различия в регистре букв (верхних/нижних) в ответе JSON, я не использую какой-либо внешний анализатор JSON.
В моем устаревшем коде некоторые поля формы определяются нетрадиционным способом, например, с использованием символов подчеркивания и заглавных букв. Проблема в том, что новая версия загрузки Spring 4 ведет себя по-другому при рендеринге JSON В ответе регистр букв другой, см. этот пример, где я использую один и тот же DTO для версий 3 и 4, но ответ JSON отличается:

Код: Выделить всё

class Test {
@jakarta.persistence.Transient
private String[] pRTasks = new String[]{"arr1"};

public String getFirstName() {
return "name";
}

public String getLCG() {
return "2";
}

public String getLCG_MAP() {
return "3";
}

public String[] getPRTasks() {
return pRTasks;
}
}
Ответ JSON для Spring Boot 3:

Код: Выделить всё

{
"firstName": "name",
"lcg": "2",
"lcg_MAP": "3",
"prtasks": [
"arr1"
]
}
Ответ JSON для Spring Boot 4:

Код: Выделить всё

{
"firstName": "name",
"LCG": "2",
"LCG_MAP": "3",
"PRTasks": [
"arr1"
]
}
Я знаю, что в этом устаревшем коде используются неверные соглашения об именах, и существует сотни таких примеров и тысячи файлов, поэтому на данный момент я не хочу переименовывать эти поля.
Это свойство не решает проблему, с которой я столкнулся: Spring.jackson.use-jackson2-defaults=true
И есть другое решение, чтобы переопределить построитель картографа Джексона, используя приведенный ниже код, но это не работает для методов получения, если переменная (не метод получения) помечена как jakarta.persistence.Transient:

Код: Выделить всё

@Bean
public JsonMapperBuilderCustomizer jsonCustomizer() {
return builder -> builder.propertyNamingStrategy(new ForceDecapitalizeStrategy());
}

public class ForceDecapitalizeStrategy extends PropertyNamingStrategies.NamingBase {
@Override
public String translate(String input) {
if (input == null || input.isEmpty()) {
return input;
}

int i = 0;
while (i < input.length()
&& Character.isUpperCase(input.charAt(i))) {
i++;
}

if (i > 1) {
return input.substring(0, i).toLowerCase()
+ input.substring(i);
}

return input;
}
}

Итак, как мне сохранить тот же регистр букв при рендеринге JSON, что и в версии 3, в версии 4, не переименовывая при этом сотни полей и интерфейс?

Подробнее здесь: https://stackoverflow.com/questions/798 ... -v3-and-v4
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»