Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Springboot:过滤器中的依赖项注入不起作用_Java_Spring_Spring Boot - Fatal编程技术网

Java Springboot:过滤器中的依赖项注入不起作用

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

我正在开发一个springboot应用程序。它包含多个过滤器。对于一个新引入的过滤器,我想注入一个bean。但是,我在尝试注入bean时遇到以下错误:

方法引发了“java.lang.UnsupportedOperationException”异常。无法计算com.test.api.filter.RContext$$EnhancerBySpringCGLIB$$4bbc6342.toString()

过滤器:

@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匹配。在采用第二种方法时,我遇到了这个问题。渐渐地,这种方法似乎更加复杂,我可能需要回到第一种方法。