java - 在 Spring 中检查自动装配代理的 instanceof
问题描述
使用 Spring 和 Spring Boot Web,注入当前请求几乎没有什么不便。只需将其添加到 bean 中,如下所示:
@Service
public class SomeService {
@Autowired
private HttpServletRequest request;
// ..
}
这样可行。注入的请求是Proxy
允许访问所有请求方法的。
然而,可能有多种类型的 a HttpServletRequest
,因为在大多数情况下它将被包装,例如ContentCachingRequestWrapper
.
有没有办法检查instanceof
注入的请求?它不起作用,因为注入的请求是 type com.sun.proxy.$Proxy
。
那失败了:
if (request instanceof ContentCachingRequestWrapper) {
// ..
}
有没有办法做到这一点?或者至少得到 bean 后面的真实类名Proxy
?
在请求的情况下,有一个解决方法:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
if (request instanceof ContentCachingRequestWrapper) {
// ..
}
这样可行。但这并不令人满意,并且不适用于Proxy
备用请求。
解决方案
我相信javax.inject.Provider
可能会做这项工作:
@Service
public class SomeService {
@Autowired
private Provider<HttpServletRequest> request;
// ..
}
我假设 Spring 在这种情况下不会创建代理,允许您直接访问当前请求。不过,您将不得不检查
推荐阅读
- regex - 正则表达式:如何替换 xml 属性中的所有嵌套双引号
- java - 不要在 JAVA 中从字符串的开头/结尾修剪制表符(\t)
- ansible - 如何查看托管主机上的文件?
- plsql - 为奇怪的符号获取正确的十六进制
- visual-studio-code - 对 .tsx/.ts 文件中的 css 类名禁用智能感知
- c++ - 将函数对象分配给函数包装器后的意外行为
- firebase-realtime-database - 使用 Firebase 规则防止空数据库路径
- swift - 将 Moya 响应错误转换为定义的类型
- apache-spark - PSQLException:错误:“WITH”处或附近的语法错误
- google-apps-script - 通过单击按钮在 Google 电子表格中的工作表之间跳转