Java Springboot:过滤器中的依赖项注入不起作用
我正在开发一个springboot应用程序。它包含多个过滤器。对于一个新引入的过滤器,我想注入一个bean。但是,我在尝试注入bean时遇到以下错误: 方法引发了“java.lang.UnsupportedOperationException”异常。无法计算com.test.api.filter.RContext$$EnhancerBySpringCGLIB$$4bbc6342.toString() 过滤器:Java Springboot:过滤器中的依赖项注入不起作用,java,spring,spring-boot,Java,Spring,Spring Boot,我正在开发一个springboot应用程序。它包含多个过滤器。对于一个新引入的过滤器,我想注入一个bean。但是,我在尝试注入bean时遇到以下错误: 方法引发了“java.lang.UnsupportedOperationException”异常。无法计算com.test.api.filter.RContext$$EnhancerBySpringCGLIB$$4bbc6342.toString() 过滤器: @Component public class ContextFilter imple
@Component
public class ContextFilter implements Filter {
private final static Logger LOG = LoggerFactory.getLogger(ContextFilter.class);
@Autowired
RContext rContext;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
LOG.info("Processing context filter");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
LOG.info("Start..",
rContext.setContextData("Test data");
LOG.info("Done..", req.getRequestURI());
}
@Override
public void destroy() {
}
}
@Scope(value="request", proxyMode= ScopedProxyMode.TARGET_CLASS)
public class RContext {
String user;
String contextData;
String activeProfile;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getContextData() {
return contextData;
}
public void setContextData(String contextData) {
this.contextData = contextData;
}
public String getActiveProfile() {
return activeProfile;
}
public void setActiveProfile(String activeProfile) {
this.activeProfile = activeProfile;
}
}
RContext类:
@Component
public class ContextFilter implements Filter {
private final static Logger LOG = LoggerFactory.getLogger(ContextFilter.class);
@Autowired
RContext rContext;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
LOG.info("Processing context filter");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
LOG.info("Start..",
rContext.setContextData("Test data");
LOG.info("Done..", req.getRequestURI());
}
@Override
public void destroy() {
}
}
@Scope(value="request", proxyMode= ScopedProxyMode.TARGET_CLASS)
public class RContext {
String user;
String contextData;
String activeProfile;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getContextData() {
return contextData;
}
public void setContextData(String contextData) {
this.contextData = contextData;
}
public String getActiveProfile() {
return activeProfile;
}
public void setActiveProfile(String activeProfile) {
this.activeProfile = activeProfile;
}
}
如果可以使用@Service注释RContext类,那么以下解决方案可能适用于doFilter方法:
RContext rContext;
ServletContext servletContext = request.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(servletContext);
rContext = wac.getBean(RContext.class);
如果可以使用@Service注释RContext类,那么以下解决方案可能适用于doFilter方法:
RContext rContext;
ServletContext servletContext = request.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(servletContext);
rContext = wac.getBean(RContext.class);
你能试着在上下文中使用“@Scope(ConfigurableBeanFactory.Scope\u PROTOTYPE)”吗?并添加“@组件”!-问题是为什么要自动连接这个简单的bean。(此代码中还有许多其他缺陷,但不在问题的范围内)非常感谢您的快速响应。这一变化对我起了作用。但是,我希望将范围保留为“request”,因为数据的有效性取决于每个请求。关于你的问题,我们有一个通用的API,目前有两个客户端正在使用。ContextId是非常特定于ClentA的东西,是由于一些技术限制而引入的。我们不想改变我们所有的API来接收这个特定的参数,因为它不是一个标准参数,我们也不想让其他客户端对此感到困惑。对于这个特定的用例,存在json视图。您可以使特定字段仅对某些客户端/视图可见。该值不是消息正文的一部分。它是一个请求参数。我的第一个计划是使参数成为可选的,但这样我们将不得不接触所有现有的API(因为我们需要引入这个新参数,这对其他客户端没有任何意义)。然后是第二种方法,我想提取此信息并填充注入bean的-->更新URI以与现有端点URI匹配。在采用第二种方法时,我遇到了这个问题。渐渐地,这种方法似乎更加复杂,我可能需要退回到第一种方法。您能否尝试在上下文中使用“@Scope(ConfigurableBeanFactory.Scope\u PROTOTYPE)”呢?并添加“@组件”!-问题是为什么要自动连接这个简单的bean。(此代码中还有许多其他缺陷,但不在问题的范围内)非常感谢您的快速响应。这一变化对我起了作用。但是,我希望将范围保留为“request”,因为数据的有效性取决于每个请求。关于你的问题,我们有一个通用的API,目前有两个客户端正在使用。ContextId是非常特定于ClentA的东西,是由于一些技术限制而引入的。我们不想改变我们所有的API来接收这个特定的参数,因为它不是一个标准参数,我们也不想让其他客户端对此感到困惑。对于这个特定的用例,存在json视图。您可以使特定字段仅对某些客户端/视图可见。该值不是消息正文的一部分。它是一个请求参数。我的第一个计划是使参数成为可选的,但这样我们将不得不接触所有现有的API(因为我们需要引入这个新参数,这对其他客户端没有任何意义)。然后是第二种方法,我想提取此信息并填充注入bean的-->更新URI以与现有端点URI匹配。在采用第二种方法时,我遇到了这个问题。渐渐地,这种方法似乎更加复杂,我可能需要回到第一种方法。