Change AbstractSmartHttpMessageConverter canRead/canWrite overrides

Extending AbstractSmartHttpMessageConverter typically requires to
override both Class and ResolvableType variants of canRead. This was not
intended as SmartHttpMessageConverter interface has default methods
doing the conversion from Class parameters to ResolvableType ones, but
AbstractHttpMessageConverter overrides it.

This commit changes AbstractSmartHttpMessageConverter canRead/canWrite
overrides from ResolvableType to Class ones that delegate to the
ResolvableType variants. It also refines
AbstractJacksonHttpMessageConverter accordingly.

Closes gh-35916
This commit is contained in:
Sébastien Deleuze
2025-11-27 15:38:35 +01:00
parent 2f1e1d483a
commit 7a19cbb452
2 changed files with 7 additions and 8 deletions
@@ -269,7 +269,7 @@ public abstract class AbstractJacksonHttpMessageConverter<T extends ObjectMapper
@Override
@SuppressWarnings("removal")
public boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType) {
public boolean canWrite(ResolvableType type, Class<?> valueClass, @Nullable MediaType mediaType) {
if (!canWrite(mediaType)) {
return false;
}
@@ -279,10 +279,10 @@ public abstract class AbstractJacksonHttpMessageConverter<T extends ObjectMapper
return false;
}
}
if (MappingJacksonValue.class.isAssignableFrom(clazz)) {
if (MappingJacksonValue.class.isAssignableFrom(valueClass)) {
throw new UnsupportedOperationException("MappingJacksonValue is not supported, use hints instead");
}
return this.mapperRegistrations == null || selectMapper(clazz, mediaType) != null;
return this.mapperRegistrations == null || selectMapper(valueClass, mediaType) != null;
}
/**
@@ -69,14 +69,13 @@ public abstract class AbstractSmartHttpMessageConverter<T> extends AbstractHttpM
}
@Override
public boolean canRead(ResolvableType type, @Nullable MediaType mediaType) {
Class<?> clazz = type.resolve();
return (clazz != null ? canRead(clazz, mediaType) : canRead(mediaType));
public boolean canRead(Class<?> clazz, @Nullable MediaType mediaType) {
return canRead(ResolvableType.forClass(clazz), mediaType);
}
@Override
public boolean canWrite(ResolvableType type, Class<?> clazz, @Nullable MediaType mediaType) {
return canWrite(clazz, mediaType);
public boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType) {
return canWrite(ResolvableType.forClass(clazz), clazz, mediaType);
}
/**