1

Spring 3.1 構成で mvc:resources を使用すると問題が発生します。

最初は、Tomcat 6 で Spring 3.0、JPA を統合するプロジェクトに取り組んでいました。Tomcat 6 サーバーでは、web.xml で次のサーブレット マッピングを使用して、アプリケーションから静的コンテンツ (css、js、png など) にアクセスしました。

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

ベスト プラクティスかどうかはわかりませんが、tomcat6 環境では問題なく動作しました。Tomcat 7 では動作しません。そのため、Spring 3.1 に切り替えて、applicationContext で mvc:resources 要素を使用しました。3.1 の xml 名前空間を変更し、applicationContext.xml に 2 行を追加しました。

<mvc:annotation-driven/>
<mvc:resources location="/resources/" mapping="/static/**"/>

上記の 2 行の構成を追加する前は、アプリケーション全体が非常にうまく機能していました。しかし、現在、アノテーションが付けられたすべてのコントローラーがフレームワークによって検出されるわけではありません。アプリケーション ルートに index.jsp やウェルカム ファイルがなく、ルート リクエスト「/」を注釈付きの RootController.java にマッピングしました。そのため、アプリケーションのホームページも読み込まれません。

解決策を求めてネットを調べたところ、mvc:annotation-driven が、フレームワークによって暗黙的に定義されていると思われるデフォルトの Bean 構成を置き換えることがわかりました。このフォーラムで、自分でいくつかの Bean 構成を明示的に定義するという、一部の人々に有効な解決策をいくつか見つけました。次の2行を追加してみました

<bean class ="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 
<bean class ="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

しかし、残念ながらそれは私の問題を解決しません。それが私が今直面している本当の問題かどうかはわかりませんので、私の現在の設定を確認するための私のapplicationContext.xmlがあります

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <context:component-scan base-package="com.yewintko.uog.emailcampaignmanager">
        <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
    </context:component-scan>

    <tx:annotation-driven/>
    <mvc:annotation-driven/>

    <mvc:resources location="/resources/" mapping="/static/**"/>
<bean class = "org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> 
<bean class = "org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>   

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

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${database.driver}"/>
        <property name="url" value="${database.url}"/>
        <property name="username" value="${database.username}"/>
        <property name="password" value="${database.password}"/>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="EmailCampaignManager"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="databasePlatform" value="${database.platform}"/>
                <property name="showSql" value="${database.showSql}"/>
                <property name="generateDdl" value="${database.generateDdl}"/>
            </bean>
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
            </props>
        </property>
    </bean>
</beans>

私は春に非常に慣れていないため、applicationContext でどの構成が欠落しているかわかりません。少し暇だったら誰か助けてください。さらに情報が必要な場合は、お知らせください。

よろしくYewint

4

2 に答える 2

0

注釈付きコントローラーが Spring によってスキャンされないのは、applicationContext.xml ファイルの次の行が原因です。

<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>

その行を削除してください。問題が解決します。これが乾杯に役立つことを願っています。

于 2012-06-13T12:14:26.770 に答える
0
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

ただし、リソースサーブレットのhttp://localhost:8080/{warname}/static/{controller} マッピングは同じURLにマッピングされます。これは、いずれかのマッピングを変更することで修正できます。リソース サーブレットが /static/* パスを指すようにしたいので、サーブレットを / に変更するだけで済みます。

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

次に、コントローラーがhttp://localhost:8080/{warname}/{controller} あり、静的コンテンツがhttp://localhost:8080/{warname}/static/

mvc:resources を /static/** で注釈が付けられたメソッドを持つコントローラーと考えてみてください。これにより、サービスに対して試行および実行するすべての要求がキャプチャされます。

本番環境でのパフォーマンス上の理由から、通常の Web サーバーを使用して静的コンテンツを提供することをお勧めします。

于 2012-06-13T12:11:19.073 に答える