Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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 NoSuchBeanDefinitionException:没有名为';metricFilter';可获得的_Java_Spring_Spring Boot - Fatal编程技术网

Java NoSuchBeanDefinitionException:没有名为';metricFilter';可获得的

Java NoSuchBeanDefinitionException:没有名为';metricFilter';可获得的,java,spring,spring-boot,Java,Spring,Spring Boot,为了部署到weblogic 10.3(java 6/servlet 2.5)…当我评论度量过滤器部分时,我正在使用spring boot 1.4.2和[spring boot legacy 1.1.0][1]。。。我只有在部署到weblogic时才会遇到问题。。。。所以我回到tomcat来运行它。。。当我尝试部署我的应用程序时,我取消了度量过滤器的注释: SEVERE: Exception starting filter metricFilter org.springframework.bean

为了部署到weblogic 10.3(java 6/servlet 2.5)…当我评论度量过滤器部分时,我正在使用spring boot 1.4.2和
[spring boot legacy 1.1.0][1]
。。。我只有在部署到weblogic时才会遇到问题。。。。所以我回到tomcat来运行它。。。当我尝试部署我的应用程序时,我取消了度量过滤器的注释:

SEVERE: Exception starting filter metricFilter
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'metricFilter' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:680)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1183)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1087)
    at org.springframework.web.filter.DelegatingFilterProxy.initDelegate(DelegatingFilterProxy.java:326)
    at org.springframework.web.filter.DelegatingFilterProxy.initFilterBean(DelegatingFilterProxy.java:235)
    at org.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:199)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:285)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:266)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4981)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5683)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1320)
    at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:683)
    at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:209)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:136)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:607)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2555)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2544)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:662)
以下是定义度量过滤器bean的
spring boot legacy
项目中
MetricFilterAutoConfiguration
的代码:

/*
 * Copyright 2012-2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.boot.legacy.context.web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration;
import org.springframework.boot.actuate.metrics.CounterService;
import org.springframework.boot.actuate.metrics.GaugeService;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.util.StopWatch;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.util.UrlPathHelper;

/**
 * {@link EnableAutoConfiguration Auto-configuration} that records Servlet interactions
 * with a {@link CounterService} and {@link GaugeService}.
 * 
 * @author Dave Syer
 * @author Phillip Webb
 */
@Configuration
@ConditionalOnBean({ CounterService.class, GaugeService.class })
@ConditionalOnClass({ Servlet.class, MetricRepositoryAutoConfiguration.class })
@ConditionalOnMissingClass("javax.servlet.ServletRegistration")
@AutoConfigureAfter({
        MetricRepositoryAutoConfiguration.class,
        org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration.class })
public class MetricFilterAutoConfiguration {

    private static final int UNDEFINED_HTTP_STATUS = 999;

    private static final String UNKNOWN_PATH_SUFFIX = "/unmapped";

    @Autowired
    private CounterService counterService;

    @Autowired
    private GaugeService gaugeService;

    @Bean
    public Filter metricFilter() {
        return new MetricsFilter();
    }

    /**
     * Filter that counts requests and measures processing times.
     */
    @Order(Ordered.HIGHEST_PRECEDENCE)
    private final class MetricsFilter extends OncePerRequestFilter {

        @Override
        protected void doFilterInternal(HttpServletRequest request,
                HttpServletResponse response, FilterChain chain) throws ServletException,
                IOException {
            UrlPathHelper helper = new UrlPathHelper();
            String suffix = helper.getPathWithinApplication(request);
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
            MetricsFilterResponseWrapper wrapper = new MetricsFilterResponseWrapper(
                    response);
            try {
                chain.doFilter(request, wrapper);
            }
            finally {
                stopWatch.stop();
                int status = getStatus(wrapper);
                Object bestMatchingPattern = request
                        .getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
                if (bestMatchingPattern != null) {
                    suffix = bestMatchingPattern.toString().replaceAll("[{}]", "-");
                }
                else if (HttpStatus.valueOf(status).is4xxClientError()) {
                    suffix = UNKNOWN_PATH_SUFFIX;
                }
                String gaugeKey = getKey("response" + suffix);
                MetricFilterAutoConfiguration.this.gaugeService.submit(gaugeKey,
                        stopWatch.getTotalTimeMillis());
                String counterKey = getKey("status." + getStatus(wrapper) + suffix);
                MetricFilterAutoConfiguration.this.counterService.increment(counterKey);
            }
        }

        private int getStatus(MetricsFilterResponseWrapper response) {
            try {
                return response.getStatus();
            }
            catch (Exception ex) {
                return UNDEFINED_HTTP_STATUS;
            }
        }

        private String getKey(String string) {
            // graphite compatible metric names
            String value = string.replace("/", ".");
            value = value.replace("..", ".");
            if (value.endsWith(".")) {
                value = value + "root";
            }
            if (value.startsWith("_")) {
                value = value.substring(1);
            }
            return value;
        }
    }

    private class MetricsFilterResponseWrapper extends HttpServletResponseWrapper {

        private int status;

        public MetricsFilterResponseWrapper(HttpServletResponse response) {
            super(response);
        }

        public int getStatus() {
            return status;
        }

        @Override
        public void setStatus(int sc) {
            setStatus(sc, null);
        }

        @Override
        public void setStatus(int status, String sm) {
            this.status = status;
            super.setStatus(status, sm);
        }
    }

}

我还需要什么来避免这个错误呢

很可能我已经解决了这个问题。。。Tomcat7实际上是Servlet3.0容器,而不是Servlet2.5。。。因此,
@ConditionalOnMissingClass(“javax.servlet.ServletRegistration”)
不满足,因为Servlet3.0中有这个类。。。所以这个bean不是被创建的。。。我正要检查tomcat 6。。。但是没有时间

根据我的理解,“MetricFilterAutoConfiguration”类未包含在配置中,这是因为至少有一个条件批注未满足。

您确定您的应用程序上下文中有“metricFilter”bean吗?@ali4j。。请检查我添加到问题中的
MetricFilterAutoConfiguration
代码,我建议您在
return new MetricsFilter()行中插入断点@ConditionalOnBean({CounterService.class,GaugeService.class})@ConditionalOnClass({Servlet.class,MetricRepositoryAutoConfiguration.class})@ConditionalOnMissingClass(“javax.servlet.ServletRegistration”)“
未满足条件。
MetricRepositoryAutoConfiguration
位于
spring boot legacy
jar中,不在spring core中。。。我在问题中包含了它的代码。我的意思是,在这个配置类[MetricFilterAutoConfiguration]中声明的那些bean没有包含在上下文中,因此您得到的是“NoSuchBeanDefinitionException”异常。
compile('org.springframework.boot:spring-boot-legacy:1.1.0.RELEASE')
/*
 * Copyright 2012-2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.boot.legacy.context.web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration;
import org.springframework.boot.actuate.metrics.CounterService;
import org.springframework.boot.actuate.metrics.GaugeService;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.util.StopWatch;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.util.UrlPathHelper;

/**
 * {@link EnableAutoConfiguration Auto-configuration} that records Servlet interactions
 * with a {@link CounterService} and {@link GaugeService}.
 * 
 * @author Dave Syer
 * @author Phillip Webb
 */
@Configuration
@ConditionalOnBean({ CounterService.class, GaugeService.class })
@ConditionalOnClass({ Servlet.class, MetricRepositoryAutoConfiguration.class })
@ConditionalOnMissingClass("javax.servlet.ServletRegistration")
@AutoConfigureAfter({
        MetricRepositoryAutoConfiguration.class,
        org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration.class })
public class MetricFilterAutoConfiguration {

    private static final int UNDEFINED_HTTP_STATUS = 999;

    private static final String UNKNOWN_PATH_SUFFIX = "/unmapped";

    @Autowired
    private CounterService counterService;

    @Autowired
    private GaugeService gaugeService;

    @Bean
    public Filter metricFilter() {
        return new MetricsFilter();
    }

    /**
     * Filter that counts requests and measures processing times.
     */
    @Order(Ordered.HIGHEST_PRECEDENCE)
    private final class MetricsFilter extends OncePerRequestFilter {

        @Override
        protected void doFilterInternal(HttpServletRequest request,
                HttpServletResponse response, FilterChain chain) throws ServletException,
                IOException {
            UrlPathHelper helper = new UrlPathHelper();
            String suffix = helper.getPathWithinApplication(request);
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
            MetricsFilterResponseWrapper wrapper = new MetricsFilterResponseWrapper(
                    response);
            try {
                chain.doFilter(request, wrapper);
            }
            finally {
                stopWatch.stop();
                int status = getStatus(wrapper);
                Object bestMatchingPattern = request
                        .getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
                if (bestMatchingPattern != null) {
                    suffix = bestMatchingPattern.toString().replaceAll("[{}]", "-");
                }
                else if (HttpStatus.valueOf(status).is4xxClientError()) {
                    suffix = UNKNOWN_PATH_SUFFIX;
                }
                String gaugeKey = getKey("response" + suffix);
                MetricFilterAutoConfiguration.this.gaugeService.submit(gaugeKey,
                        stopWatch.getTotalTimeMillis());
                String counterKey = getKey("status." + getStatus(wrapper) + suffix);
                MetricFilterAutoConfiguration.this.counterService.increment(counterKey);
            }
        }

        private int getStatus(MetricsFilterResponseWrapper response) {
            try {
                return response.getStatus();
            }
            catch (Exception ex) {
                return UNDEFINED_HTTP_STATUS;
            }
        }

        private String getKey(String string) {
            // graphite compatible metric names
            String value = string.replace("/", ".");
            value = value.replace("..", ".");
            if (value.endsWith(".")) {
                value = value + "root";
            }
            if (value.startsWith("_")) {
                value = value.substring(1);
            }
            return value;
        }
    }

    private class MetricsFilterResponseWrapper extends HttpServletResponseWrapper {

        private int status;

        public MetricsFilterResponseWrapper(HttpServletResponse response) {
            super(response);
        }

        public int getStatus() {
            return status;
        }

        @Override
        public void setStatus(int sc) {
            setStatus(sc, null);
        }

        @Override
        public void setStatus(int status, String sm) {
            this.status = status;
            super.setStatus(status, sm);
        }
    }

}