|
1 | 1 | /*
|
2 |
| - * Copyright 2002-2020 the original author or authors. |
| 2 | + * Copyright 2002-2024 the original author or authors. |
3 | 3 | *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | 5 | * you may not use this file except in compliance with the License.
|
|
32 | 32 | import org.springframework.core.MethodParameter;
|
33 | 33 | import org.springframework.http.HttpMethod;
|
34 | 34 | import org.springframework.lang.Nullable;
|
35 |
| -import org.springframework.util.ClassUtils; |
36 | 35 | import org.springframework.web.bind.support.WebDataBinderFactory;
|
37 | 36 | import org.springframework.web.context.request.NativeWebRequest;
|
38 | 37 | import org.springframework.web.context.request.WebRequest;
|
|
68 | 67 | */
|
69 | 68 | public class ServletRequestMethodArgumentResolver implements HandlerMethodArgumentResolver {
|
70 | 69 |
|
71 |
| - @Nullable |
72 |
| - private static Class<?> pushBuilder; |
73 |
| - |
74 |
| - static { |
75 |
| - try { |
76 |
| - pushBuilder = ClassUtils.forName("jakarta.servlet.http.PushBuilder", |
77 |
| - ServletRequestMethodArgumentResolver.class.getClassLoader()); |
78 |
| - } |
79 |
| - catch (ClassNotFoundException ex) { |
80 |
| - // Servlet 4.0 PushBuilder not found - not supported for injection |
81 |
| - pushBuilder = null; |
82 |
| - } |
83 |
| - } |
84 |
| - |
85 |
| - |
86 | 70 | @Override
|
87 | 71 | public boolean supportsParameter(MethodParameter parameter) {
|
88 | 72 | Class<?> paramType = parameter.getParameterType();
|
89 | 73 | return (WebRequest.class.isAssignableFrom(paramType) ||
|
90 | 74 | ServletRequest.class.isAssignableFrom(paramType) ||
|
91 | 75 | MultipartRequest.class.isAssignableFrom(paramType) ||
|
92 | 76 | HttpSession.class.isAssignableFrom(paramType) ||
|
93 |
| - (pushBuilder != null && pushBuilder.isAssignableFrom(paramType)) || |
| 77 | + PushBuilder.class.isAssignableFrom(paramType) || |
94 | 78 | (Principal.class.isAssignableFrom(paramType) && !parameter.hasParameterAnnotations()) ||
|
95 | 79 | InputStream.class.isAssignableFrom(paramType) ||
|
96 | 80 | Reader.class.isAssignableFrom(paramType) ||
|
@@ -143,8 +127,13 @@ private Object resolveArgument(Class<?> paramType, HttpServletRequest request) t
|
143 | 127 | }
|
144 | 128 | return session;
|
145 | 129 | }
|
146 |
| - else if (pushBuilder != null && pushBuilder.isAssignableFrom(paramType)) { |
147 |
| - return PushBuilderDelegate.resolvePushBuilder(request, paramType); |
| 130 | + else if (PushBuilder.class.isAssignableFrom(paramType)) { |
| 131 | + PushBuilder pushBuilder = request.newPushBuilder(); |
| 132 | + if (pushBuilder != null && !paramType.isInstance(pushBuilder)) { |
| 133 | + throw new IllegalStateException( |
| 134 | + "Current push builder is not of type [" + paramType.getName() + "]: " + pushBuilder); |
| 135 | + } |
| 136 | + return pushBuilder; |
148 | 137 | }
|
149 | 138 | else if (InputStream.class.isAssignableFrom(paramType)) {
|
150 | 139 | InputStream inputStream = request.getInputStream();
|
@@ -189,22 +178,4 @@ else if (ZoneId.class == paramType) {
|
189 | 178 | throw new UnsupportedOperationException("Unknown parameter type: " + paramType.getName());
|
190 | 179 | }
|
191 | 180 |
|
192 |
| - |
193 |
| - /** |
194 |
| - * Inner class to avoid a hard dependency on Servlet API 4.0 at runtime. |
195 |
| - */ |
196 |
| - private static class PushBuilderDelegate { |
197 |
| - |
198 |
| - @Nullable |
199 |
| - public static Object resolvePushBuilder(HttpServletRequest request, Class<?> paramType) { |
200 |
| - PushBuilder pushBuilder = request.newPushBuilder(); |
201 |
| - if (pushBuilder != null && !paramType.isInstance(pushBuilder)) { |
202 |
| - throw new IllegalStateException( |
203 |
| - "Current push builder is not of type [" + paramType.getName() + "]: " + pushBuilder); |
204 |
| - } |
205 |
| - return pushBuilder; |
206 |
| - |
207 |
| - } |
208 |
| - } |
209 |
| - |
210 | 181 | }
|
0 commit comments