2

CarpoolDB と Carpool の 2 つのプロジェクトがあります。

CarpoolDB : バックエンドのものを含み、

carpool-application-context.xml

<context:annotation-config />
<context:component-scan base-package="com.onmobile" />
<context:property-placeholder location="classpath:server.properties" />

サーバーのプロパティ

cm.db.driverClassName=com.mysql.jdbc.Driver
cm.db.url=jdbc:mysql://localhost:3306/carpool1
cm.db.username=abc
cm.db.password=xyz

carpoolDB の jar を作成し、Carpool Application に配置します。

Carpool: UI が含まれており、バックエンド コンタクト用の carpoolDB jar があり、

carpool-application-context1.xml

<import resource="classpath:carpool-application-context.xml"/>
<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpool.authentication" />

spring-servlet.xml

<context:property-placeholder location="classpath:carpool.properties" /> 

<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpool.controller, com.onmobile.carpool.util" />

carpool.properties

cm.email.sender.mail.smtp.host=mail.on.com

現在、1 つのクラス com.onmobile.carpool.util.EmailSender があり、1 つのプロパティ smtpHost があり、@Value を使用して Spring によって値が注入されるようにしたいのですが、注入されていません。

@Controller
public class EmailSender {

    public static final Log logger = LogFactory.getLog(EmailSender.class);

    @Value("${cm.email.sender.mail.smtp.host}")
    private String smtpHost;

}

次のようにエラーが発生しています

java.lang.IllegalArgumentException: Could not resolve placeholder 'cm.email.sender.mail.smtp.host'

carpool.properties は src フォルダーにあります。

carpool.properties ファイルから cm.email.sender.mail.smtp.host を選択しないのはなぜですか。jarファイルに存在するプロパティファイルとの関係はありますか。

ファイルが見つからないなどのログに表示されないため、実際にはプロパティファイルが読み込まれますが、フィールドは自動配線されません。



インポートを削除した後、更新された完全な構成ファイルを投稿する

web.xml

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
            /WEB-INF/carpool-application-context1.xml
            /WEB-INF/applicationContext-security.xml
        </param-value>
  </context-param>
  <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>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/jsp/*</url-pattern>
  </servlet-mapping>
  <listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  <listener>
    <listener-class>
        org.springframework.security.web.session.HttpSessionEventPublisher
        </listener-class>
  </listener>

carpool-application-context1.xml

<!-- Configure annotated beans --> 
<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpooldb.db" />
<context:property-placeholder location="classpath:carpool.properties" />


   <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <beans:property name="driverClassName"><beans:value>${cm.db.driverClassName}</beans:value></beans:property>
        <beans:property name="url"><beans:value>${cm.db.url}</beans:value></beans:property>
        <beans:property name="username"><beans:value>${cm.db.username}</beans:value></beans:property>
        <beans:property name="password"><beans:value>${cm.db.password}</beans:value></beans:property>
        <beans:property name="testOnBorrow"><beans:value>true</beans:value></beans:property>
        <beans:property name="testOnReturn"><beans:value>true</beans:value></beans:property>
        <beans:property name="validationQuery"><beans:value>select 1</beans:value></beans:property>
        <beans:property name="maxIdle"><beans:value>-1</beans:value></beans:property>
        <beans:property name="maxActive"><beans:value>-1</beans:value></beans:property>
        <beans:property name="maxOpenPreparedStatements"><beans:value>-1</beans:value></beans:property>
        <beans:property name="maxWait"><beans:value>30000</beans:value></beans:property>
    </beans:bean>

    //session factory bean and other configuration 

spring-servlet.xml

<context:property-placeholder location="classpath:carpool.properties" />

<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpool.authentication, com.onmobile.carpool.controller, com.onmobile.carpool.util" />


<!-- Declare a view resolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

    <!-- one of the properties available; the maximum file size in bytes -->
    <property name="maxUploadSize" value="100000"/>
</bean>

carpool.properties

cm.db.driverClassName=com.mysql.jdbc.Driver
cm.db.url=jdbc:mysql://localhost:3306/carpool
cm.db.username=abc
cm.db.password=xyz

user.profile.pic.base.folder=D:\\carpoolRepository\\carpoolProfilePicUpload
google.places.autocomplete.response.xml.base.folder=D:\\carpoolRepository\\googleMapXML

#EMAIL - FORGOT PASSWORD 
cm.email.sender.mail.smtp.host=mail.on.com

上記のEmailSenderの「smtpHost」プロパティの方法でcm.email.sender.mail.smtp.hostの値を挿入しようとしていますが、それを読むとnullと表示されます。cm.db.driverClassName などの他のプロパティは、carpool-application-context1.xml に適切に挿入されます。

構成ファイルの場所を含むスナップを添付していますここに画像の説明を入力

4

1 に答える 1

3

がインポート元にあり<context:component-scan base-package="com.onmobile" /> 、コントローラーがルートWebアプリコンテキストで作成されるように強制されます。これは、が含まれ、ルートコンテキストの構成がないためです。carpool-application-context.xmlcarpool-application-context1.xml"com.onmobile""com.onmobile.carpool.controller"property-placeholder

サーブレットコンテキスト(spring-servlet.xml)にプロパティプレースホルダーコンフィギュレーターがあります。プロパティプレースホルダーコンフィギュレーター(context:property-placeholderタグで定義)はBeanポストプロセッサーであり、コンテナーごとに機能するため、定義されていないコンテキストのBean定義を変更することはできません。したがって、で宣言されたコントローラーインスタンスのBean定義を変更することはできません。ルートコンテキスト(carpool-application-context.xml、carpool-application-context1.xml)。したがって、ダブルスキャンにより、コントローラーはルートコンテキストとサーブレットコンテキストの両方で2回作成され、正しいプレースホルダーコンフィギュレーターによって処理されるのは1つだけです。

修正として、component-scanでフィルター式を使用@Controllerして、でのみ注釈付きクラスを取得し、 /spring-servlet.xmlから除外することができます。carpool-application-context.xmlcarpool-application-context1.xml

フィルタの例については、@Serviceが2回構築されるを参照してください

Springの構成はシンプルにしてください。構成は非常に不可解です。

@Controllerコントローラー(注釈が付けられているので、パッケージに入れる方がよいと思います)と、パッケージaaa.bbb.controllersで注釈を付ける必要のあるサービスを混同していることを更新します。私のアドバイスは、サービスをルートWebアプリコンテキスト(carpool-application-context1.xml)に移動し、そこにプロパティプレースホルダーconfigurer宣言を配置することです。@Serviceutil

于 2013-01-31T07:25:25.663 に答える