首页 > 解决方案 > 在 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备用请求。

标签: javaspringspring-boot

解决方案


我相信javax.inject.Provider可能会做这项工作:

@Service
public class SomeService {
    @Autowired
    private Provider<HttpServletRequest> request;

    // ..
}

我假设 Spring 在这种情况下不会创建代理,允许您直接访问当前请求。不过,您将不得不检查


推荐阅读