Spring - @PostConstruct method called two times
这是我的Spring Controller类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Controller public class SchedularController{ @Autowired ProjectRepository projectRepository; @Autowired UtilityRepository utilityRepository; @PostConstruct public void postconstruct(){ System.out.println("Starting schedular..."); } } |
问题是当我启动服务器时postconstruct方法运行两次。
我检查了另一篇文章,其中大部分内容是:"如果您有多个框架管理同一个bean类,例如JSF和CDI,或JSF和Spring,或CDI和Spring等,则可能会发生这种情况。"
但是我没有使用JSF或CDI并仍然存在此问题。(而且我的@PostConstruct方法在控制器类中)
该如何解决?
编辑-
这是我的pom文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>WBPPM</groupId> WBPPM</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <url>http://maven.apache.org</url> <properties> <spring.version>4.0.3.RELEASE</spring.version> <spring.security.version>3.0.5.RELEASE</spring.security.version> <mongo-java-driver.version>3.0.2</mongo-java-driver.version> <spring-data-commons.version>1.7.2.RELEASE</spring-data-commons.version> <spring-data-mongodb.version>1.4.2.RELEASE</spring-data-mongodb.version> <org.aspectj-version>1.7.4</org.aspectj-version> <jackson.databind-version>2.2.3</jackson.databind-version> <log4j.version>1.2.17</log4j.version> <slf4j.version>1.7.6</slf4j.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- Spring Security --> <dependency> <groupId>org.springframework.security</groupId> spring-security-web</artifactId> <version>${spring.security.version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> spring-security-config</artifactId> <version>${spring.security.version}</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> spring-aop</artifactId> <version>${spring.version}</version> </dependency> <!-- <dependency> <groupId>org.springframework</groupId> spring-aspects</artifactId> <version>${spring.version}</version> </dependency> --> <dependency> <groupId>org.springframework</groupId> spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework.ws</groupId> spring-oxm</artifactId> <version>1.5.10</version> </dependency> <dependency> <groupId>org.codehaus.jettison</groupId> jettison</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.codehaus.castor</groupId> castor</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>xerces</groupId> xercesImpl</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> jaxb-api</artifactId> <version>2.0</version> </dependency> <!-- Xstream and Json provider --> <dependency> <groupId>com.thoughtworks.xstream</groupId> xstream</artifactId> <version>1.3.1</version> <type>jar</type> </dependency> <!-- Jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> jackson-databind</artifactId> <version>${jackson.databind-version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> jackson-annotations</artifactId> <version>${jackson.databind-version}</version> </dependency> <!-- Spring / MongoDB --> <dependency> <groupId>org.mongodb</groupId> mongo-java-driver</artifactId> <version>${mongo-java-driver.version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> spring-data-mongodb</artifactId> <version>${spring-data-mongodb.version}</version> </dependency> <dependency> <groupId>cglib</groupId> cglib</artifactId> <version>2.2.2</version> </dependency> <!-- Tiles plugins --> <dependency> <groupId>org.apache.tiles</groupId> tiles-jsp</artifactId> <version>3.0.3</version> </dependency> <!-- <dependency> <groupId>org.slf4j</groupId> slf4j-log4j12</artifactId> <version>1.5.11</version> </dependency> --> <!-- JSTL plugins --> <!-- Log4j --> <dependency> <groupId>log4j</groupId> log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> jstl</artifactId> <version>1.2</version> </dependency> <!-- java mail --> <dependency> <groupId>javax.mail</groupId> mail</artifactId> <version>1.4.4</version> </dependency> <!-- AspectJ --> <dependency> <groupId>org.aspectj</groupId> aspectjrt</artifactId> <version>${org.aspectj-version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> aspectjweaver</artifactId> <version>${org.aspectj-version}</version> </dependency> <dependency> <groupId>commons-lang</groupId> commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> commons-fileupload</artifactId> <version>1.2.2</version> </dependency> <!-- Recaptcha check Api --> <dependency> <groupId>org.glassfish</groupId> javax.json</artifactId> <version>1.0.2</version> </dependency> <!-- Apache Commons Upload --> <dependency> <groupId>commons-io</groupId> commons-io</artifactId> <version>1.3.2</version> </dependency> <!-- Jasper Report --> <!-- <dependency> <groupId>net.sf.jasperreports</groupId> jasperreports</artifactId> <version>5.6.0</version> </dependency> --> <!-- Freemarker Template --> <dependency> <groupId>org.freemarker</groupId> freemarker</artifactId> <version>2.3.20</version> </dependency> <!-- <dependency> <groupId>com.jolbox</groupId> bonecp</artifactId> <version>0.8.0.RELEASE</version> </dependency> --> <!-- Excel File Read/write --> <dependency> <groupId>org.apache.poi</groupId> poi-ooxml</artifactId> <version>3.11</version> </dependency> <!-- amazonaws --> <dependency> <groupId>com.amazonaws</groupId> aws-java-sdk-s3</artifactId> <version>1.10.4</version> </dependency> <!-- Push Notification --> <dependency> <groupId>com.ganyo</groupId> gcm-server</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>es.arcadiaconsulting.javapns</groupId> javapns</artifactId> <version>2.2-json</version> </dependency> <!-- http://mvnrepository.com/artifact/it.sauronsoftware.cron4j/cron4j --> <dependency> <groupId>it.sauronsoftware.cron4j</groupId> cron4j</artifactId> <version>2.2.5</version> </dependency> </dependencies> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> maven-war-plugin</artifactId> <version>2.3</version> <configuration> <warSourceDirectory>WebContent</warSourceDirectory> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> </project> |
这是我的spring上下文文件-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-1.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd"> <context:component-scan base-package="com.wb.ppm" /> <context:annotation-config /> <mvc:annotation-driven /> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**/*" /> <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor"> <property name="cacheSeconds" value="0" /> <property name="useExpiresHeader" value="true" /> <property name="useCacheControlHeader" value="true" /> <property name="useCacheControlNoStore" value="true" /> </bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/*" /> <bean class="com.wb.ppm.util.interceptor.WBInterceptor"> </bean> </mvc:interceptor> </mvc:interceptors> <bean id="loggingAspect" class="com.wb.ppm.util.logging.LoggingAspect" /> <bean id="applicationContext" class="com.wb.ppm.security.SpringApplicationContext" factory-method="getInstance" /> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> </bean> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> <property name="defaultLocale" value="en" /> </bean> <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <property name="paramName" value="language" /> </bean> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> <property name="interceptors"> <list> <ref bean="localeChangeInterceptor" /> </list> </property> </bean> <!-- Register the welcome.properties --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="ApplicationResources" /> </bean> <!-- Factory bean that creates the Mongo instance --> <context:property-placeholder location="classpath:mongodb.properties" order="1" /> <bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean"> <property name="host" value="${mongo.host.name}" /> <property name="port" value="${mongo.host.port}" /> </bean> <bean id="mongoDbFactory" class="org.springframework.data.mongodb.core.SimpleMongoDbFactory"> <constructor-arg name="mongo" ref="mongo" /> <constructor-arg name="databaseName" value="${mongo.db.name}" /> </bean> <mongo:mapping-converter id="converter" /> <bean name="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate"> <constructor-arg ref="mongoDbFactory" /> <constructor-arg ref="converter" /> </bean> <bean id="userCredentials" class="org.springframework.data.authentication.UserCredentials"> <constructor-arg name="username" value="${mongo.db.username}" /> <constructor-arg name="password" value="${mongo.db.password}" /> </bean> <!-- MongoConverter for converting the dot in map key to \\+ in mongodb --> <bean id="mongoMoxydomainConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter"> <constructor-arg index="0" ref="mongoDbFactory" /> <constructor-arg index="1"> <bean class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" /> </constructor-arg> <property name="mapKeyDotReplacement" value="\\\\+"/> </bean> <!-- MongoTemplate for connecting and querying the documents in the database --> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> <constructor-arg name="mongoConverter" ref="mongoMoxydomainConverter"/> <!-- <constructor-arg name="userCredentials" ref="userCredentials" /> --> </bean> <!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes --> <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> <!-- Register the welcome.properties --> <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer"> <property name="definitions"> <list> <value>/WEB-INF/tiles.xml</value> </list> </property> </bean> <bean id="tilesviewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" /> <property name="order" value="2"></property> </bean> <bean id="jstlviewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/pages/" /> <property name="suffix" value=".jsp" /> <property name="order" value="3"></property> </bean> <!-- Configure to plugin JSON as request and response in method handler --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="jsonMessageConverter" /> <ref bean="xmlMessageConverter" /> </list> </property> </bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> </bean> <!-- Configure bean to convert JSON to POJO and vice versa --> <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes" value="application/json" /> </bean> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="150000000"/> <property name="maxInMemorySize" value="150000000"/> </bean> <bean id="xmlMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> <property name="marshaller" ref="castorMarshaller" /> <property name="unmarshaller" ref="castorMarshaller" /> <property name="supportedMediaTypes" value="application/xml" /> </bean> <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller"> </bean> <bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <map> <entry key="NotAuthorizedException" value="redirect:/login" /> </map> </property> <property name="defaultErrorView" value="redirect:/pages/error/globalError.jsp" /> </bean> |
这是我的web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>WorldBankPPM</display-name> <!-- Spring Listeners --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:worldbank-context.xml classpath:security-applicationContext.xml </param-value> </context-param> <context-param> <param-name>log4j-config-location</param-name> <param-value>src/log4j.properties</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/worldbank-context.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> <url-pattern>/login</url-pattern> </servlet-mapping> <session-config> <session-timeout>360</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/assets/*</url-pattern> <url-pattern>/vendor/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>mappedfile</param-name> <param-value>false</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <error-page> <error-code>404</error-code> <location>/pages/error/error404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/pages/error/globalError.jsp</location> </error-page> <!-- <security-constraint> <web-resource-collection> <web-resource-name>securedapp</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> --> |
几天前我也面临着同样的问题,并且我已经成功解决了这个问题。
就我而言,我已经使用Spring启动程序创建了应用程序。
在Eclipse或任何IDE中导入项目时,您会看到主包中有两个类:
ServletInitializer.java,当我们创建war文件并在tomcat服务器下运行时会调用它。
YourApplication.java包含
我已参考此文件创建战争文件并进行必要的更改。
问题是我忘了删除ServletInitializer.java,它也包含相同的方法,这是初始化两次的主要原因。
一旦从该文件中删除了多余的代码,Spring Boot将只初始化一次上下文,并且能够执行一次代码。