A resposta aceita não funcionará para o meu caso.
No meu caso, a classe não é minha. A classe problemática vem de dependências de terceiros, então não posso simplesmente adicionar @JsonProperty
anotações a ela.
Para resolvê-lo, inspirado na resposta de @burak acima, criei um custom PropertyNamingStrategy
como segue:
mapper.setPropertyNamingStrategy(new PropertyNamingStrategy() {
@Override
public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName)
{
if (method.getParameterCount() == 1 &&
(method.getRawParameterType(0) == Boolean.class || method.getRawParameterType(0) == boolean.class) &&
method.getName().startsWith("set")) {
Class<?> containingClass = method.getDeclaringClass();
String potentialFieldName = "is" + method.getName().substring(3);
try {
containingClass.getDeclaredField(potentialFieldName);
return potentialFieldName;
} catch (NoSuchFieldException e) {
}
}
return super.nameForSetterMethod(config, method, defaultName);
}
@Override
public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName)
{
if(method.hasReturnType() && (method.getRawReturnType() == Boolean.class || method.getRawReturnType() == boolean.class)
&& method.getName().startsWith("is")) {
Class<?> containingClass = method.getDeclaringClass();
String potentialFieldName = method.getName();
try {
containingClass.getDeclaredField(potentialFieldName);
return potentialFieldName;
} catch (NoSuchFieldException e) {
}
}
return super.nameForGetterMethod(config, method, defaultName);
}
});
Basicamente, o que isso faz é, antes de serializar e desserializar, verificar na classe de destino / origem qual nome de propriedade está presente na classe, se é isEnabled
ou enabled
propriedade.
Com base nisso, o mapeador será serializado e desserializado para o nome da propriedade existente.
isSuccess
o nome do seu método deve serisIsSuccess
eu acho