diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java index 325d22687c3..0c314a5b944 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java @@ -1895,10 +1895,9 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac if (logger.isTraceEnabled()) { logger.trace("Invoking init method '" + initMethodName + "' on bean with name '" + beanName + "'"); } + Method methodToInvoke = ClassUtils.getInterfaceMethodIfPossible(initMethod); if (System.getSecurityManager() != null) { - Method methodToInvoke = ClassUtils.getInterfaceMethodIfPossible(initMethod); - AccessController.doPrivileged((PrivilegedAction) () -> { ReflectionUtils.makeAccessible(methodToInvoke); return null; @@ -1914,8 +1913,8 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac } else { try { - ReflectionUtils.makeAccessible(initMethod); - initMethod.invoke(bean); + ReflectionUtils.makeAccessible(methodToInvoke); + methodToInvoke.invoke(bean); } catch (InvocationTargetException ex) { throw ex.getTargetException(); diff --git a/spring-context/src/main/java/org/springframework/context/MessageSource.java b/spring-context/src/main/java/org/springframework/context/MessageSource.java index 6396a016bb1..fb17668689a 100644 --- a/spring-context/src/main/java/org/springframework/context/MessageSource.java +++ b/spring-context/src/main/java/org/springframework/context/MessageSource.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 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. @@ -26,10 +26,10 @@ import org.springframework.lang.Nullable; * *

Spring provides two out-of-the-box implementations for production: *

* * @author Rod Johnson @@ -41,16 +41,17 @@ public interface MessageSource { /** * Try to resolve the message. Return default message if no message was found. - * @param code the code to lookup up, such as 'calculator.noRateSet'. Users of - * this class are encouraged to base message names on the relevant fully - * qualified class name, thus avoiding conflict and ensuring maximum clarity. + * @param code the code to lookup up, e.g. 'calculator.noRateSet'. + * MessageSource users are encouraged to base message names on qualified class + * or package names, avoiding potential conflicts and ensuring maximum clarity. * @param args an array of arguments that will be filled in for params within * the message (params look like "{0}", "{1,date}", "{2,time}" within a message), - * or {@code null} if none. + * or {@code null} if none * @param defaultMessage a default message to return if the lookup fails * @param locale the locale in which to do the lookup - * @return the resolved message if the lookup was successful; - * otherwise the default message passed as a parameter + * @return the resolved message if the lookup was successful, otherwise + * the default message passed as a parameter (which may be {@code null}) + * @see #getMessage(MessageSourceResolvable, Locale) * @see java.text.MessageFormat */ @Nullable @@ -58,13 +59,16 @@ public interface MessageSource { /** * Try to resolve the message. Treat as an error if the message can't be found. - * @param code the code to lookup up, such as 'calculator.noRateSet' + * @param code the code to lookup up, e.g. 'calculator.noRateSet'. + * MessageSource users are encouraged to base message names on qualified class + * or package names, avoiding potential conflicts and ensuring maximum clarity. * @param args an array of arguments that will be filled in for params within * the message (params look like "{0}", "{1,date}", "{2,time}" within a message), - * or {@code null} if none. + * or {@code null} if none * @param locale the locale in which to do the lookup - * @return the resolved message - * @throws NoSuchMessageException if the message wasn't found + * @return the resolved message (never {@code null}) + * @throws NoSuchMessageException if no corresponding message was found + * @see #getMessage(MessageSourceResolvable, Locale) * @see java.text.MessageFormat */ String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException; @@ -76,9 +80,15 @@ public interface MessageSource { * since at the time of calling this method we aren't able to determine if the * {@code defaultMessage} property of the resolvable is {@code null} or not. * @param resolvable the value object storing attributes required to resolve a message + * (may include a default message) * @param locale the locale in which to do the lookup - * @return the resolved message - * @throws NoSuchMessageException if the message wasn't found + * @return the resolved message (never {@code null} since even a + * {@code MessageSourceResolvable}-provided default message needs to be non-null) + * @throws NoSuchMessageException if no corresponding message was found + * (and no default message was provided by the {@code MessageSourceResolvable}) + * @see MessageSourceResolvable#getCodes() + * @see MessageSourceResolvable#getArguments() + * @see MessageSourceResolvable#getDefaultMessage() * @see java.text.MessageFormat */ String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException; diff --git a/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java b/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java index b3168b883c5..b4d81398a6a 100644 --- a/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java +++ b/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java @@ -134,8 +134,8 @@ public class ResolvableTypeTests { assertThat(type.isAssignableFrom(String.class)).isTrue(); } - @Test - public void forRawClassAssignableFromTypeVariable() { // gh-23321 + @Test // gh-23321 + public void forRawClassAssignableFromTypeVariable() throws Exception { ResolvableType typeVariable = ResolvableType.forClass(ExtendsList.class).as(List.class).getGeneric(); ResolvableType raw = ResolvableType.forRawClass(CharSequence.class); assertThat(raw.resolve()).isEqualTo(CharSequence.class); @@ -442,12 +442,8 @@ public class ResolvableTypeTests { interfaces.add(interfaceType.toString()); } assertThat(interfaces.toString()).isEqualTo( - "[" - + "java.io.Serializable, " - + "java.lang.Cloneable, " - + "java.util.List, " - + "java.util.RandomAccess" - + "]"); + "[java.io.Serializable, java.lang.Cloneable, " + + "java.util.List, java.util.RandomAccess]"); } @Test