2012-05-28 48 views
8

nhận được một số vấn đề trong ứng dụng mùa xuân của tôi.Singleton mùa xuân được gọi hai lần

Tôi có đậu mùa xuân rất đơn giản, chúng được tiêm vào các loại đậu xuân khác nhau. Trong khi gỡ rối tôi tìm thấy, họ đang được gọi là hai lần, Constructor & @PostConstruct cả hai được gọi là hai lần.

Ứng dụng của tôi không có công nghệ giao diện người dùng. Nó chỉ đơn giản là cho nhiệm vụ phụ trợ liên quan.

Xuân Cấu hình

<?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:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:lang="http://www.springframework.org/schema/lang" xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd"> 


    <context:component-scan base-package="com.green.integration" /> 

    <!-- ######################################################## --> 
    <!-- EXPOSING SPRING BEAN VIA HTTPINVOKER SPRING REMOTING --> 
    <!-- ######################################################## --> 

    <bean name="/switch" 
     class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"> 
     <property name="service" ref="SwitchController" /> 
     <property name="serviceInterface" 
      value="com.green.ISwitchController" /> 
    </bean> 

    <!-- Load in application properties reference --> 
    <bean id="applicationProperties" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location" value="classpath:application.properties" /> 
    </bean> 


    <bean id="mongo" class="com.mongodb.Mongo"> 
     <constructor-arg value="${mongo.server}" /> 
     <constructor-arg value="${mongo.port}" /> 
    </bean> 

    <bean id="morphia" class="com.google.code.morphia.Morphia"> 
    </bean> 


</beans> 

Xuân Bean Lớp

@Repository 
public class TransactionDAO extends BasicDAO<Transaction, ObjectId> { 
    private Datastore datastore; 

    @Autowired 
    public TransactionDAO(Mongo mongo, Morphia morphia) { 
     super(mongo, morphia, "itransact"); 
     morphia.map(Transaction.class); 
     // TO USE MONGO WITHOUT SECURITY 
     this.datastore = morphia.createDatastore(mongo, "itransact"); 
     logger.debug("***** CONNECTED TO MONGODB SUCCESSFULLY *****"); 
     this.datastore.ensureIndexes(); 
     // this.datastore.ensureCaps(); 
    } 
} 

Constructor "TransactionDAO" đang được gọi là hai lần.

Tôi cố gắng để xem cuộc gọi stack trace bởi

Throwable t = new Throwable(); 
System.out.println(t.getStackTrace()[1].toString()); 

và mỗi lần nó cho thấy sau

sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
+1

Bạn có chắc chắn '@ PostConstruct' cũng được gọi là hai lần không? Constructor được gọi hai lần có thể dễ dàng giải thích, nhưng không phải là '@ PostConstruct'. –

+0

Bạn có cấu hình bộ điều phối servlet không? –

+0

Có thể bạn đã nhập khẩu xml ngữ cảnh ứng dụng từ tệp cấu hình xml của một ngữ cảnh khác qua ? –

Trả lời

16

Tôi chỉ tìm ra vấn đề và đặc biệt nhờ vào @Juan Alberto người cho tôi gợi ý cho vấn đề.

Mô tả: Thực ra tôi đã cung cấp tệp applicationContext.xml cho cả contextListner và servatcher dispatcher. Vì vậy, đậu thứ nhất đã được khởi tạo cho lõi lò xo và lần thứ hai để điều phối lò xo.

Tôi đã đổ cấu hình ngay bây giờ, vào applicationContext.xml và applicationContext-dispatcher.xml chỉ có cấu hình có liên quan của chúng và hạt của tôi đang khởi chạy một lần đúng cách.

Problematic Configs

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 


<servlet> 
    <servlet-name>remoting</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </init-param> 
    <load-on-startup>0</load-on-startup> 
</servlet> 

Giải Quyết Configs

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 


<servlet> 
    <servlet-name>remoting</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext-dispatcher.xml</param-value> 
    </init-param> 
    <load-on-startup>0</load-on-startup> 
</servlet> 
+4

Tôi không hiểu những gì chứa chúng ta nên đặt trong 'applicationContext-dispatcher.xml' và những gì nên được đặt trong' applicationContext.xml' –

5

Thực ra vấn đề của bạn là bạn có thể được xác định đậu trong servlet điều phối và cũng bối cảnh mùa xuân của bạn, điều phối cung cấp một khác nhau ngữ cảnh nhưng nó (ngữ cảnh phụ tôi nghĩ) của bối cảnh chính để cách đúng đắn để làm mọi thứ là có ngữ cảnh chính quét "các lớp mô hình" của bạn và người điều phối chỉ quét các bộ điều khiển.

Tôi hy vọng điều này sẽ giúp bạn.

Các vấn đề liên quan