diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/PrincipalMethodArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/PrincipalMethodArgumentResolver.java index 4c7d9824ad45..859eaef433ac 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/PrincipalMethodArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/PrincipalMethodArgumentResolver.java @@ -17,6 +17,7 @@ package org.springframework.messaging.simp.annotation.support; import java.security.Principal; +import java.util.Optional; import org.springframework.core.MethodParameter; import org.springframework.messaging.Message; @@ -24,7 +25,7 @@ import org.springframework.messaging.simp.SimpMessageHeaderAccessor; /** - * {@link HandlerMethodArgumentResolver} to a {@link Principal}. + * {@link HandlerMethodArgumentResolver} to a {@link Principal} or {@link Optional} of {@link Principal}. * * @author Rossen Stoyanchev * @since 4.0 @@ -33,17 +34,19 @@ public class PrincipalMethodArgumentResolver implements HandlerMethodArgumentRes @Override public boolean supportsParameter(MethodParameter parameter) { - Class paramType = parameter.getParameterType(); + MethodParameter nestedParameter = parameter.nestedIfOptional(); + Class paramType = nestedParameter.getNestedParameterType(); return Principal.class.isAssignableFrom(paramType); } @Override - public Object resolveArgument(MethodParameter parameter, Message message) throws Exception { + public Object resolveArgument(MethodParameter parameter, Message message){ Principal user = SimpMessageHeaderAccessor.getUser(message.getHeaders()); - if (user == null) { - throw new MissingSessionUserException(message); + if (parameter.isOptional()) { + return Optional.ofNullable(user); + } else { + return user; } - return user; } }