diff --git a/spring-beans/src/main/java/org/springframework/beans/CachedIntrospectionResults.java b/spring-beans/src/main/java/org/springframework/beans/CachedIntrospectionResults.java index 2929509d23..8332045197 100644 --- a/spring-beans/src/main/java/org/springframework/beans/CachedIntrospectionResults.java +++ b/spring-beans/src/main/java/org/springframework/beans/CachedIntrospectionResults.java @@ -367,7 +367,7 @@ public final class CachedIntrospectionResults { for (Method method : beanClass.getMethods()) { if (!this.propertyDescriptors.containsKey(method.getName()) && - !readMethodNames.contains((method.getName())) && isPlainAccessor(method)) { + !readMethodNames.contains(method.getName()) && isPlainAccessor(method)) { this.propertyDescriptors.put(method.getName(), new GenericTypeAwarePropertyDescriptor(beanClass, method.getName(), method, null, null)); readMethodNames.add(method.getName()); @@ -376,8 +376,11 @@ public final class CachedIntrospectionResults { } private boolean isPlainAccessor(Method method) { - if (method.getParameterCount() > 0 || method.getReturnType() == void.class || - method.getDeclaringClass() == Object.class || Modifier.isStatic(method.getModifiers())) { + if (Modifier.isStatic(method.getModifiers()) || + method.getDeclaringClass() == Object.class || method.getDeclaringClass() == Class.class || + method.getParameterCount() > 0 || method.getReturnType() == void.class || + ClassLoader.class.isAssignableFrom(method.getReturnType()) || + ProtectionDomain.class.isAssignableFrom(method.getReturnType())) { return false; } try { diff --git a/spring-web/src/test/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessorTests.java b/spring-web/src/test/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessorTests.java index bc3be0e7aa..c3ab1ed072 100644 --- a/spring-web/src/test/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessorTests.java +++ b/spring-web/src/test/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -269,7 +269,7 @@ public class ModelAttributeMethodProcessorTests { assertThat(this.container.getModel().get("testBean")).isSameAs(testBean); } - @Test // gh-25182 + @Test // gh-25182 public void resolveConstructorListArgumentFromCommaSeparatedRequestParameter() throws Exception { MockHttpServletRequest mockRequest = new MockHttpServletRequest(); mockRequest.addParameter("listOfStrings", "1,2"); @@ -279,7 +279,6 @@ public class ModelAttributeMethodProcessorTests { given(factory.createBinder(any(), any(), eq("testBeanWithConstructorArgs"))) .willAnswer(invocation -> { WebRequestDataBinder binder = new WebRequestDataBinder(invocation.getArgument(1)); - // Add conversion service which will convert "1,2" to a list binder.setConversionService(new DefaultFormattingConversionService()); return binder; @@ -309,7 +308,6 @@ public class ModelAttributeMethodProcessorTests { private boolean validateInvoked; - public StubRequestDataBinder(Object target, String objectName) { super(target, objectName); } @@ -345,7 +343,7 @@ public class ModelAttributeMethodProcessorTests { } - @SessionAttributes(types=TestBean.class) + @SessionAttributes(types = TestBean.class) private static class ModelAttributeHandler { @SuppressWarnings("unused") @@ -360,6 +358,7 @@ public class ModelAttributeMethodProcessorTests { } } + static class TestBeanWithConstructorArgs { final List listOfStrings; @@ -367,15 +366,15 @@ public class ModelAttributeMethodProcessorTests { public TestBeanWithConstructorArgs(List listOfStrings) { this.listOfStrings = listOfStrings; } - } - @ModelAttribute("modelAttrName") @SuppressWarnings("unused") + + @ModelAttribute("modelAttrName") + @SuppressWarnings("unused") private String annotatedReturnValue() { return null; } - @SuppressWarnings("unused") private TestBean notAnnotatedReturnValue() { return null; diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java index 5f4e40a0cf..091a3f4fa0 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2248,6 +2248,7 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl assertThat(response.getContentAsString()).isEqualTo("foo-body"); } + @Controller static class ControllerWithEmptyValueMapping { @@ -3585,7 +3586,6 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl assertThat(headers.getContentType()).as("Invalid Content-Type").isEqualTo(new MediaType("text", "html")); multiValueMap(headers, writer); } - } @Controller