Если вы используете загрузку Spring, по умолчанию она использует Jackson для анализа JSON. В Джексоне нет опции конфигурации для отключения этой функции, как упоминалось в этой проблеме . Решение состоит в том, чтобы зарегистрировать пользовательский JsonDeserializer
, который выдает исключение, как только он встречает любой другой токен, кроме JsonToken.VALUE_STRING
public class StringOnlyDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
if (!JsonToken.VALUE_STRING.equals(jsonParser.getCurrentToken())) {
throw deserializationContext.wrongTokenException(jsonParser, String.class, JsonToken.VALUE_STRING, "No type conversion is allowed, string expected");
} else {
return jsonParser.getValueAsString();
}
}
}
Если вы хотите применить это только к определенным классам или полям, вы можете пометить их аннотацией @JsonDeserialize
. Например:
public class Student {
private String name;
@JsonDeserialize(using = StringOnlyDeserializer.class)
private String age;
// TODO: Getters + Setters
}
Кроме того, вы можете зарегистрировать пользовательский модуль Джексона, зарегистрировав компонент SimpleModule
, который автоматически десериализует все строки, используя StringOnlyDeserializer
. Например:
@Bean
public Module customModule() {
SimpleModule customModule = new SimpleModule();
customModule.addDeserializer(String.class, new StringOnlyDeserializer());
return customModule;
}
Это похоже на то, что предложил Евгений .
Если вы запустите приложение сейчас и укажете недопустимый возраст, такой как 12
, 12.3
или [12]
, оно выдаст исключение с сообщением типа:
JSON parse error: Unexpected token (VALUE_NUMBER_FLOAT), expected VALUE_STRING: Not allowed to parse numbers to string; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (VALUE_NUMBER_FLOAT), expected VALUE_STRING: Not allowed to parse numbers to string\n at [Source: (PushbackInputStream); line: 3, column: 9] (through reference chain: com.example.xyz.Student[\"age\"])