10

私の春のアプリケーションにいくつかの問題を抱えています。

私は非常に単純な春の豆を持っています、それらは他の様々な春の豆に注入されます。私が見つけたデバッグ中に、それらは2回呼び出され、Constructorと@PostConstructは両方とも2回呼び出されています。

私のアプリケーションにはフロントエンドテクノロジーがありません。その単純なバックエンドタスク関連。

スプリング構成

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

春豆クラス

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

コンストラクター「TransactionDAO」が2回呼び出されています。

によってコールスタックトレースを監視しようとしました

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

そしてそれが次を示すたびに

sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
4

2 に答える 2

17

私は問題を理解し、問題のヒントをくれた@JuanAlbertoに特に感謝します。

説明:実際には、contextListnerとディスパッチャーサーブレットの両方に1つのapplicationContext.xmlファイルを指定していました。つまり、1番目のBeanはスプリングコア用に初期化され、2番目はスプリングディスパッチャー用に初期化されていました。

私は今、構成をapplicationContext.xmlとapplicationContext-dispatcher.xmlにこぼしました。これらは、関連する構成のみを持ち、Beanは一度正しく初期化されています。

問題のある構成

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

解決された構成

<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>
于 2012-05-29T08:56:51.123 に答える
5

実際、あなたの問題は、ディスパッチャーサーブレットとSpringコンテキストでBeanを定義している可能性があることです。ディスパッチャーは異なるコンテキストを提供しますが、メインコンテキストのそれ(私が思うにサブコンテキスト)なので、物事を行う正しい方法はメインコンテキストは「モデルクラス」をスキャンし、ディスパッチャはコントローラのみをスキャンします。

これがお役に立てば幸いです。

于 2012-05-29T14:02:04.347 に答える