1

@RequestMapping の動作にいくつかの奇妙な問題があります。これがシナリオです

@Controller クラスといくつかの @RequestMapping メソッドを含む Web プロジェクトがあります。彼らは正常に動作します。たとえば、1 つのマッピングは @RequestMapping("/jpm/{param}/add") です。

最初のプロジェクトに戦争オーバーレイを使用した別の Web プロジェクトがあります。すべてが正常に動作し、コントローラーとそのメソッドを継承します。今のところ問題ありません。

今度は、2 番目のプロジェクトに新しい @Controller が必要です。他のものと同じように追加しますが、別の @RequestMapping ("/jpm/{param}/activate") メソッドを使用します。

@Controller と @RequestMapping は、ログで確認できるようにSpringによって正常に読み取られますが、「/jpm/{param}/add」は機能しますが、「/jpm/{param}/activate」は機能しません。404リソースがないと表示されます見つかった。

両方のクラスは異なるパッケージに含まれていますが、両方がロードされています。各プロジェクトに 1 つずつ、コンポーネント スキャンという 2 つのコンテキストがあります。両方のクラスが同じパッケージ (名前) にある場合、(異なるプロジェクトであっても) 正常に動作することがわかりました。

それは正常ですか?私は何が欠けていますか?コントローラーとマッピングが読み取られるのに機能しないのはなぜですか?

私はこれに腹を立てています、どんなアドバイスも大歓迎です!.

web.xml (最初のプロジェクト)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        WEB-INF/applicationContext.xml, 
        WEB-INF/spring-locale.xml, 
        WEB-INF/spring-security.xml,
        WEB-INF/spring-datasource.xml,
        WEB-INF/spring-hibernate.xml,
        WEB-INF/spring-jpm.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>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

<servlet>
    <servlet-name>jpm</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
...

これが私のMVC構成ファイルで、ほとんどが標準的なものです

<?xml version="1.0" encoding="UTF-8"?>
<!-- this file will contain all of JPM Spring Web MVC-specific components -->
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc       http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/context   http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    ...
    <context:component-scan base-package="jpaoletti.jpm2.controller"/>
    ...
</beans>

*最終編集: 解決策 *

ドキュメントのためだけに:

最初のプロジェクトで、サーブレット設定ファイル (jpm-servlet.xml) を追加しました

<import resource="jpm-servlet-custom.xml" />

そして2番目のプロジェクトでは:

jpm-servlet-custom.xml

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

    <context:component-scan base-package="another.package.controller">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

</beans>
4

2 に答える 2

1

ご質問から

両方のクラスは異なるパッケージに含まれていますが、両方がロードされています。各プロジェクトに 1 つずつ、コンポーネント スキャンという 2 つのコンテキストがあります。両方のクラスが同じパッケージ (名前) にある場合、(異なるプロジェクトであっても) 正常に動作することがわかりました。

2 番目のプロジェクトの MVC コンテキストがまったく読み込まれていないか、アプリケーションの によって読み込まれていないようですDispatcherServlet。このため、component-scanは 2 番目のプロジェクトをロードしていません@Controller

によってコンテキストがロードされていることを確認してくださいDispatcherServlet.

于 2013-09-01T01:54:22.220 に答える