Skip to content

Commit fd8e4ab

Browse files
committed
Introduce ResolvableType.toClass() shortcut
Issue: SPR-17086
1 parent 31bfc1d commit fd8e4ab

File tree

26 files changed

+40
-28
lines changed

26 files changed

+40
-28
lines changed

spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,12 @@ private static boolean isResolvedTypeMatch(Method genericMethod, Method candidat
159159
Class<?> candidateParameter = candidateParameters[i];
160160
if (candidateParameter.isArray()) {
161161
// An array type: compare the component type.
162-
if (!candidateParameter.getComponentType().equals(genericParameter.getComponentType().resolve(Object.class))) {
162+
if (!candidateParameter.getComponentType().equals(genericParameter.getComponentType().toClass())) {
163163
return false;
164164
}
165165
}
166166
// A non-array type: compare the type itself.
167-
if (!candidateParameter.equals(genericParameter.resolve(Object.class))) {
167+
if (!candidateParameter.equals(genericParameter.toClass())) {
168168
return false;
169169
}
170170
}

spring-core/src/main/java/org/springframework/core/Conventions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ else if (Collection.class.isAssignableFrom(resolvedType)) {
212212
ReactiveAdapter adapter = reactiveAdapterRegistry.getAdapter(valueClass);
213213
if (adapter != null && !adapter.getDescriptor().isNoValue()) {
214214
reactiveSuffix = ClassUtils.getShortName(valueClass);
215-
valueClass = ResolvableType.forMethodReturnType(method).getGeneric().resolve(Object.class);
215+
valueClass = ResolvableType.forMethodReturnType(method).getGeneric().toClass();
216216
}
217217
}
218218
}

spring-core/src/main/java/org/springframework/core/GenericTypeResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ private static ResolvableType resolveVariable(TypeVariable<?> typeVariable, Reso
229229
*/
230230
@SuppressWarnings("rawtypes")
231231
public static Class<?> resolveType(Type genericType, Map<TypeVariable, Type> map) {
232-
return ResolvableType.forType(genericType, new TypeVariableMapVariableResolver(map)).resolve(Object.class);
232+
return ResolvableType.forType(genericType, new TypeVariableMapVariableResolver(map)).toClass();
233233
}
234234

235235
/**

spring-core/src/main/java/org/springframework/core/ResolvableType.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,18 @@ public Object getSource() {
229229
return (source != null ? source : this.type);
230230
}
231231

232+
/**
233+
* Return this type as a resolved {@code Class}, falling back to
234+
* {@link java.lang.Object} if no specific class can be resolved.
235+
* @return the resolved {@link Class} or the {@code Object} fallback
236+
* @since 5.1
237+
* @see #getRawClass()
238+
* @see #resolve(Class)
239+
*/
240+
public Class<?> toClass() {
241+
return resolve(Object.class);
242+
}
243+
232244
/**
233245
* Determine whether the given object is an instance of this {@code ResolvableType}.
234246
* @param obj the object to check
@@ -328,7 +340,7 @@ private boolean isAssignableFrom(ResolvableType other, @Nullable Map<Type, Type>
328340
if (ourResolved == null) {
329341
ourResolved = resolve(Object.class);
330342
}
331-
Class<?> otherResolved = other.resolve(Object.class);
343+
Class<?> otherResolved = other.toClass();
332344

333345
// We need an exact type match for generics
334346
// List<CharSequence> is not assignable from List<String>

spring-core/src/main/java/org/springframework/core/codec/ByteArrayEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public ByteArrayEncoder() {
4343

4444
@Override
4545
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) {
46-
Class<?> clazz = elementType.resolve(Object.class);
46+
Class<?> clazz = elementType.toClass();
4747
return super.canEncode(elementType, mimeType) && byte[].class.isAssignableFrom(clazz);
4848
}
4949

spring-core/src/main/java/org/springframework/core/codec/ByteBufferEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public ByteBufferEncoder() {
4444

4545
@Override
4646
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) {
47-
Class<?> clazz = elementType.resolve(Object.class);
47+
Class<?> clazz = elementType.toClass();
4848
return super.canEncode(elementType, mimeType) && ByteBuffer.class.isAssignableFrom(clazz);
4949
}
5050

spring-core/src/main/java/org/springframework/core/codec/CharSequenceEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ private CharSequenceEncoder(MimeType... mimeTypes) {
5656

5757
@Override
5858
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) {
59-
Class<?> clazz = elementType.resolve(Object.class);
59+
Class<?> clazz = elementType.toClass();
6060
return super.canEncode(elementType, mimeType) && CharSequence.class.isAssignableFrom(clazz);
6161
}
6262

spring-core/src/main/java/org/springframework/core/codec/DataBufferEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public DataBufferEncoder() {
4343

4444
@Override
4545
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) {
46-
Class<?> clazz = elementType.resolve(Object.class);
46+
Class<?> clazz = elementType.toClass();
4747
return super.canEncode(elementType, mimeType) && DataBuffer.class.isAssignableFrom(clazz);
4848
}
4949

spring-core/src/main/java/org/springframework/core/codec/ResourceEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public ResourceEncoder(int bufferSize) {
6060

6161
@Override
6262
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) {
63-
Class<?> clazz = elementType.resolve(Object.class);
63+
Class<?> clazz = elementType.toClass();
6464
return (super.canEncode(elementType, mimeType) && Resource.class.isAssignableFrom(clazz));
6565
}
6666

spring-core/src/main/java/org/springframework/core/codec/ResourceRegionEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public ResourceRegionEncoder(int bufferSize) {
7373
@Override
7474
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) {
7575
return super.canEncode(elementType, mimeType)
76-
&& ResourceRegion.class.isAssignableFrom(elementType.resolve(Object.class));
76+
&& ResourceRegion.class.isAssignableFrom(elementType.toClass());
7777
}
7878

7979
@Override

spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public TypeDescriptor(Property property) {
120120
*/
121121
protected TypeDescriptor(ResolvableType resolvableType, @Nullable Class<?> type, @Nullable Annotation[] annotations) {
122122
this.resolvableType = resolvableType;
123-
this.type = (type != null ? type : resolvableType.resolve(Object.class));
123+
this.type = (type != null ? type : resolvableType.toClass());
124124
this.annotatedElement = new AnnotatedElementAdapter(annotations);
125125
}
126126

spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public void addConverterFactory(ConverterFactory<?, ?> factory) {
117117
"ConverterFactory [" + factory.getClass().getName() + "]; does the class parameterize those types?");
118118
}
119119
addConverter(new ConverterFactoryAdapter(factory,
120-
new ConvertiblePair(typeInfo[0].resolve(Object.class), typeInfo[1].resolve(Object.class))));
120+
new ConvertiblePair(typeInfo[0].toClass(), typeInfo[1].toClass())));
121121
}
122122

123123
@Override
@@ -351,7 +351,7 @@ private final class ConverterAdapter implements ConditionalGenericConverter {
351351

352352
public ConverterAdapter(Converter<?, ?> converter, ResolvableType sourceType, ResolvableType targetType) {
353353
this.converter = (Converter<Object, Object>) converter;
354-
this.typeInfo = new ConvertiblePair(sourceType.resolve(Object.class), targetType.resolve(Object.class));
354+
this.typeInfo = new ConvertiblePair(sourceType.toClass(), targetType.toClass());
355355
this.targetType = targetType;
356356
}
357357

spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ public void resolveVariableGenericArrayUnknownWithFallback() throws Exception {
619619
ResolvableType type = ResolvableType.forField(Fields.class.getField("variableTypeGenericArray"));
620620
assertThat(type.getType().toString(), equalTo("T[]"));
621621
assertThat(type.isArray(), equalTo(true));
622-
assertThat(type.resolve(Object.class), equalTo((Class) Object.class));
622+
assertThat(type.toClass(), equalTo((Class) Object.class));
623623
}
624624

625625
@Test

spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MessageMethodArgumentResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public Object resolveArgument(MethodParameter parameter, Message<?> message) thr
9797
private Class<?> getPayloadType(MethodParameter parameter) {
9898
Type genericParamType = parameter.getGenericParameterType();
9999
ResolvableType resolvableType = ResolvableType.forType(genericParamType).as(Message.class);
100-
return resolvableType.getGeneric().resolve(Object.class);
100+
return resolvableType.getGeneric().toClass();
101101
}
102102

103103
/**

spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ public Class<?> getParameterType() {
282282
return this.returnValue.getClass();
283283
}
284284
if (!ResolvableType.NONE.equals(this.returnType)) {
285-
return this.returnType.resolve(Object.class);
285+
return this.returnType.toClass();
286286
}
287287
return super.getParameterType();
288288
}

spring-web/src/main/java/org/springframework/http/codec/FormHttpMessageReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public Charset getDefaultCharset() {
8484
public boolean canRead(ResolvableType elementType, @Nullable MediaType mediaType) {
8585
return ((MULTIVALUE_TYPE.isAssignableFrom(elementType) ||
8686
(elementType.hasUnresolvableGenerics() &&
87-
MultiValueMap.class.isAssignableFrom(elementType.resolve(Object.class)))) &&
87+
MultiValueMap.class.isAssignableFrom(elementType.toClass()))) &&
8888
(mediaType == null || MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)));
8989
}
9090

spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public List<MediaType> getWritableMediaTypes() {
9393
@Override
9494
public boolean canWrite(ResolvableType elementType, @Nullable MediaType mediaType) {
9595
return (mediaType == null || MediaType.TEXT_EVENT_STREAM.includes(mediaType) ||
96-
ServerSentEvent.class.isAssignableFrom(elementType.resolve(Object.class)));
96+
ServerSentEvent.class.isAssignableFrom(elementType.toClass()));
9797
}
9898

9999
@Override

spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Decoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ protected AbstractJackson2Decoder(ObjectMapper mapper, MimeType... mimeTypes) {
6868
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
6969
JavaType javaType = getObjectMapper().getTypeFactory().constructType(elementType.getType());
7070
// Skip String: CharSequenceDecoder + "*/*" comes after
71-
return (!CharSequence.class.isAssignableFrom(elementType.resolve(Object.class)) &&
71+
return (!CharSequence.class.isAssignableFrom(elementType.toClass()) &&
7272
getObjectMapper().canDeserialize(javaType) && supportsMimeType(mimeType));
7373
}
7474

spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Encoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public void setStreamingMediaTypes(List<MediaType> mediaTypes) {
100100

101101
@Override
102102
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) {
103-
Class<?> clazz = elementType.resolve(Object.class);
103+
Class<?> clazz = elementType.toClass();
104104
return supportsMimeType(mimeType) && (Object.class == clazz ||
105105
(!String.class.isAssignableFrom(elementType.resolve(clazz)) && getObjectMapper().canSerialize(clazz)));
106106
}

spring-web/src/main/java/org/springframework/http/codec/multipart/SynchronossPartHttpMessageReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public List<MediaType> getReadableMediaTypes() {
8686

8787
@Override
8888
public boolean canRead(ResolvableType elementType, @Nullable MediaType mediaType) {
89-
return Part.class.equals(elementType.resolve(Object.class)) &&
89+
return Part.class.equals(elementType.toClass()) &&
9090
(mediaType == null || MediaType.MULTIPART_FORM_DATA.isCompatibleWith(mediaType));
9191
}
9292

spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public Jaxb2XmlEncoder() {
6060
@Override
6161
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) {
6262
if (super.canEncode(elementType, mimeType)) {
63-
Class<?> outputClass = elementType.resolve(Object.class);
63+
Class<?> outputClass = elementType.toClass();
6464
return (outputClass.isAnnotationPresent(XmlRootElement.class) ||
6565
outputClass.isAnnotationPresent(XmlType.class));
6666
}

spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public boolean supports(HandlerResult result) {
8989
}
9090
ReactiveAdapter adapter = getAdapter(result);
9191
return adapter != null && !adapter.isNoValue() &&
92-
isSupportedType(result.getReturnType().getGeneric().resolve(Object.class));
92+
isSupportedType(result.getReturnType().getGeneric().toClass());
9393
}
9494

9595
@Nullable

spring-webflux/src/main/java/org/springframework/web/reactive/result/view/ViewResolutionResultHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public boolean supports(HandlerResult result) {
157157
if (adapter.isNoValue()) {
158158
return true;
159159
}
160-
type = result.getReturnType().getGeneric().resolve(Object.class);
160+
type = result.getReturnType().getGeneric().toClass();
161161
}
162162

163163
return (type != null &&

spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ protected Class<?> getReturnValueType(@Nullable Object returnValue, MethodParame
288288
else {
289289
Type type = getHttpEntityType(returnType);
290290
type = (type != null ? type : Object.class);
291-
return ResolvableType.forMethodParameter(returnType, type).resolve(Object.class);
291+
return ResolvableType.forMethodParameter(returnType, type).toClass();
292292
}
293293
}
294294

spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public ResponseBodyEmitter handleValue(Object returnValue, MethodParameter retur
123123
Assert.state(adapter != null, "Unexpected return value: " + returnValue);
124124

125125
ResolvableType elementType = ResolvableType.forMethodParameter(returnType).getGeneric();
126-
Class<?> elementClass = elementType.resolve(Object.class);
126+
Class<?> elementClass = elementType.toClass();
127127

128128
Collection<MediaType> mediaTypes = getMediaTypes(request);
129129
Optional<MediaType> mediaType = mediaTypes.stream().filter(MimeType::isConcrete).findFirst();

spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ public Class<?> getParameterType() {
271271
return this.returnValue.getClass();
272272
}
273273
if (!ResolvableType.NONE.equals(this.returnType)) {
274-
return this.returnType.resolve(Object.class);
274+
return this.returnType.toClass();
275275
}
276276
return super.getParameterType();
277277
}

0 commit comments

Comments
 (0)