diff --git a/config/src/main/java/org/springframework/security/config/annotation/AbstractSecurityBuilder.java b/config/src/main/java/org/springframework/security/config/annotation/AbstractSecurityBuilder.java index 1c7fcc1947..7cc666dad4 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/AbstractSecurityBuilder.java +++ b/config/src/main/java/org/springframework/security/config/annotation/AbstractSecurityBuilder.java @@ -39,7 +39,7 @@ public abstract class AbstractSecurityBuilder implements SecurityBuilder { object = doBuild(); return object; } - throw new IllegalStateException("This object has already been built"); + throw new AlreadyBuiltException("This object has already been built"); } /** diff --git a/config/src/main/java/org/springframework/security/config/annotation/AlreadyBuiltException.java b/config/src/main/java/org/springframework/security/config/annotation/AlreadyBuiltException.java new file mode 100644 index 0000000000..dd18467527 --- /dev/null +++ b/config/src/main/java/org/springframework/security/config/annotation/AlreadyBuiltException.java @@ -0,0 +1,31 @@ +/* + * Copyright 2002-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.security.config.annotation; + +/** + * Thrown when {@link AbstractSecurityBuilder#build()} is two or more times. + * + * @author Rob Winch + * @since 3.2 + */ +public class AlreadyBuiltException extends IllegalStateException { + + public AlreadyBuiltException(String message) { + super(message); + } + + private static final long serialVersionUID = -5891004752785553015L; +} diff --git a/config/src/main/java/org/springframework/security/config/annotation/SecurityBuilder.java b/config/src/main/java/org/springframework/security/config/annotation/SecurityBuilder.java index 36e103fa7c..277ef29e49 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/SecurityBuilder.java +++ b/config/src/main/java/org/springframework/security/config/annotation/SecurityBuilder.java @@ -29,7 +29,7 @@ public interface SecurityBuilder { * Builds the object and returns it or null. * * @return the Object to be built or null if the implementation allows it. - * @throws Exception if an error occured when building the Object + * @throws Exception if an error occurred when building the Object */ O build() throws Exception; } diff --git a/config/src/main/java/org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.java b/config/src/main/java/org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.java index ae715f28c9..c872eca045 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.java +++ b/config/src/main/java/org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.java @@ -34,6 +34,7 @@ import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.annotation.Order; import org.springframework.core.type.AnnotationMetadata; import org.springframework.security.access.expression.SecurityExpressionHandler; +import org.springframework.security.config.annotation.AlreadyBuiltException; import org.springframework.security.config.annotation.ObjectPostProcessor; import org.springframework.security.config.annotation.SecurityConfigurer; import org.springframework.security.config.annotation.web.WebSecurityConfigurer; @@ -87,7 +88,11 @@ public class WebSecurityConfiguration implements ImportAware, BeanClassLoaderAwa if(!hasConfigurers) { throw new IllegalStateException("At least one non-null instance of "+ WebSecurityConfigurer.class.getSimpleName()+" must be exposed as a @Bean when using @EnableWebSecurity. Hint try extending "+ WebSecurityConfigurerAdapter.class.getSimpleName()); } - return webSecurity.getOrBuild(); + try { + return webSecurity.build(); + } catch (AlreadyBuiltException e) { + return webSecurity.getObject(); + } } /**