2012-05-28 15 views
8

çağrılıyor.Yay tekilleştirme, bahar uygulamamda bir sorun olmak üzere iki kez

Oldukça basit bir bahar fasulyem var, onlar diğer çeşitli bahar fasulyelerine enjekte edilir. Ben hata ayıklama bulurken, onlar iki kez denir Constructor & @ PostConstruct iki kez denir.

Uygulamamın ön uç teknolojisi yoktur. Sadece arka uç görevi ile ilgili.

Bahar Yapılandırma

<?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> 

Bahar Bean Sınıf

@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(); 
    } 
} 

Yapıcı "TransactionDAO" İki kez deniliyor.

Ben

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

tarafından çağrı yığın izleme izlemek için çalıştı ve her seferinde

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

@ PostConstruct'ın iki kez de çağrıldığından kesinlikle emin misiniz? İki kere çağrılan kurucu kolayca açıklanabilir, ancak 'PostConstruct' değil. –

+0

Bir dağıtıcı sunucu yapılandırmanız var mı? –

+0

Belki de başka bir içeriğin xml konfigürasyon dosyasından x12 konfigürasyon dosyasından içe aktarılan uygulama içeriğiniz ? –

cevap

16

aşağıdaki Ben sadece bana ipucu vermek @Juan Alberto sorun ve özel teşekkür anladım gösterdi soruna

Açıklama: Aslında hem contextListner hem de dispatcher sunucu uygulaması için bir applicationContext.xml dosyası veriyordum. Böylece 1 fasulye ilkbahar çekirdeği için ilkbahar ve ilkbahar dağıtıcısı için 2 kez başladı.

Şimdi yapılandırmayı, yalnızca ilgili yapılandırmalarına sahip olan fasulye ve applicationContext-dispatcher.xml dosyasına döktüm ve çekirdeklerim düzgün bir şekilde başlatılıyor.

Sorunlu Yapılandırml

<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> 

çözüldü 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

Neyi içerdiğini anlamıyorum, “applicationContext-dispatcher.xml” 'i yerleştirmemiz ve' applicationContext.xml '' ne yazmamız gerekiyor? –

5

Aslında Sorununuz sevk görevlisi servlet'dir fasulye tanımlayan olabilir ve aynı zamanda bahar bağlam, memuru farklı sağlamasıdır Bu bağlamda ana bağlamın bağlamı (benim düşüncem alt bağlamı), bu yüzden, bir şeyleri yapmanın doğru yolu, ana içeriğinizin "model sınıflarını" taramasını sağlamaktır ve dağıtıcı sadece denetleyicileri taramaktadır.

Umarım bu size yardımcı olur.