La réponse acceptée ne fonctionnera pas pour mon cas.
Dans mon cas, la classe ne m'appartient pas. La classe problématique provient de dépendances tierces, je ne peux donc pas simplement y ajouter une @JsonProperty
annotation.
Pour le résoudre, inspiré de la réponse @burak ci-dessus, j'ai créé une personnalisation PropertyNamingStrategy
comme suit:
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);
}
});
Fondamentalement, cela fait, avant de sérialiser et de désérialiser, il vérifie dans la classe cible / source quel nom de propriété est présent dans la classe, que ce soit isEnabled
ou une enabled
propriété.
Sur cette base, le mappeur sérialisera et désérialisera le nom de propriété existant.
isSuccess
, le nom de votre méthode doit êtreisIsSuccess
je pense