मेरे पास एक आरईएसटी पूर्ण वेब सेवा है जो स्प्रिंग बूट 1.2.0-रिलीज के साथ लागू होती है जो कभी-कभी स्टार्टअप पर निम्न अपवाद फेंकता है।स्पष्ट वसंत बूट दौड़ की स्थिति डुप्लिकेट वसंत के कारण सुरक्षा सुरक्षा फ़िल्टरर
03-Feb-2015 11:42:23.697 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
...
Caused by: java.lang.IllegalStateException: Duplicate Filter registration for 'springSecurityFilterChain'. Check to ensure the Filter is only configured once.
at org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer.registerFilter(AbstractSecurityWebApplicationInitializer.java:215)
at org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer.insertSpringSecurityFilterChain(AbstractSecurityWebApplicationInitializer.java:147)
...
जब मैं "कभी कभी" कहते हैं, मैं बस बिलाव सर्वर (संस्करण 8.0.17) को पुन: प्रारंभ मतलब या तो इस अपवाद निकलेगा या सफलतापूर्वक मुद्दे के बिना लोड होगा।
यह स्प्रिंग बूट पर निर्मित एक सर्वलेट 3.0 एप्लिकेशन है, इसलिए हमारे पास पारंपरिक वेब.एक्सएमएल फ़ाइल नहीं है। इसके बजाए, हम जावा का उपयोग करके हमारे सर्वलेट को प्रारंभ करते हैं।
package com.v.dw.webservice;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
public class WebXml extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ApplicationConfig.class);
}
}
हम यह भी विकास के दौरान mvn spring-boot:run
आदेश का लाभ उठाने, और इस रेस स्थिति अभी तक जब इस तरह से चलाने के प्रकट करने के लिए है। हमारे विन्यास के "रूट" और मुख्य Maven द्वारा प्रयोग किया जाता विधि एक ही कक्षा में कर रहे हैं:
package com.v.dw.webservice;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.ManagementSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
@SpringBootApplication
@EnableAutoConfiguration(exclude = {ManagementSecurityAutoConfiguration.class, SecurityAutoConfiguration.class})
public class ApplicationConfig {
public static void main(String[] args) {
SpringApplication.run(ApplicationConfig.class, args);
}
@Value("${info.build.version}")
private String apiVersion;
@Bean
@Primary
@ConfigurationProperties(prefix="datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
}
मैं परीक्षण के लिए एक कस्टम में स्मृति प्रमाणीकरण प्रदाता का उपयोग करने के लिए हमारे प्रमाणीकरण तर्क को सरल बनाने की कोशिश की है। जहां तक मैं कह सकता हूं, क्लासपाथ पर यह एकमात्र कस्टम प्रमाणीकरण प्रदाता है, और हम एप्लिकेशन रूट पैकेज के बाहर कोई कॉन्फ़िगरेशन कक्षाएं आयात नहीं करते हैं।
दुर्भाग्य से प्रवेश स्प्रिंग और बिलाव द्वारा प्रदान की उत्पादन त्रुटि के आसपास किसी भी संदर्भ प्रदान करने में मदद नहीं करता है, इसलिए मैं यहाँ से AbstractSecurityWebApplictionInitializer स्रोत हथियाने की कोशिश की:
और मैं एक में registerFilter(...)
विधि संशोधित System.out
कॉल जोड़कर कुछ उपयोगी डीबग आउटपुट उत्पन्न करने का प्रयास करें।
private final void registerFilter(ServletContext servletContext, boolean insertBeforeOtherFilters, String filterName, Filter filter) {
System.out.println(">>>>>> Registering filter '" + filterName + "' with: " + filter.getClass().toString());
Dynamic registration = servletContext.addFilter(filterName, filter);
if(registration == null) {
System.out.println(">>>>>> Existing filter '" + filterName + "' as: " + servletContext.getFilterRegistration(filterName).getClassName());
throw new IllegalStateException("Duplicate Filter registration for '" + filterName +"'. Check to ensure the Filter is only configured once.");
}
registration.setAsyncSupported(isAsyncSecuritySupported());
EnumSet<DispatcherType> dispatcherTypes = getSecurityDispatcherTypes();
registration.addMappingForUrlPatterns(dispatcherTypes, !insertBeforeOtherFilters, "/*");
}
जब यह विफल हो जाता है, तो डीबग आउटपुट केवल अपवाद से ठीक पहले उत्पन्न होता है। यह इंगित करता है registerFilter(...)
विधि केवल एक बार कहा जाता है और वसंत लोड हो रहा है इस प्रक्रिया में अपेक्षाकृत देर से:
>>>>>> Registering filter 'springSecurityFilterChain' with: class org.springframework.web.filter.DelegatingFilterProxy
. ____ _ __ _ _
/\\/___'_ __ _ _(_)_ __ __ _ \ \ \ \
(()\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ))))
' |____| .__|_| |_|_| |_\__, |////
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.2.0.RELEASE)
यह पता चलता है सुरक्षा विन्यास हो रहा है:
>>>>>> Registering filter 'springSecurityFilterChain' with: class org.springframework.web.filter.DelegatingFilterProxy
>>>>>> Existing filter 'springSecurityFilterChain' as: org.springframework.security.web.FilterChainProxy
जब यह काम करता है, डिबग आउटपुट इस तरह दिखता है बहुत पहले लोडिंग प्रक्रिया में जब यह काम करता है बनाम बनाम काम करता है।