@RequestMapping在maven war覆盖上的奇怪行为

时间:2013-09-01 01:41:28

标签: java spring maven spring-mvc

我对@RequestMapping行为有一些奇怪的问题。这是方案

我有一个带有@Controller类和一些@RequestMapping方法的Web项目。他们工作正常。一个映射是,例如,@ RequestMapping(“/ jpm / {param} / add”)

我在第一个项目上有另一个带有war叠加层的Web项目。每件事都很好,我继承了控制器和它的方法。到目前为止没问题。

现在我想在第二个项目中使用新的@Controller。我添加它就像另一个但使用不同的@RequestMapping(“/ jpm / {param} / activate”)方法。

由于我可以在日志中看到@Controller和@RequestMapping很好,因为我可以在日志中看到它们,但是,当“/ jpm / {param} / add”工作时,“/ jpm / {param} / activate”没有,它说找不到404资源。

两个类都在不同的包中,但都加载了,我有两个上下文:组件扫描,每个项目一个。我发现如果两个类都在同一个包(名称)中,它们工作正常(即使在不同的项目中)。

这是正常的吗?我错过了什么?为什么控制器和映射被引用但只是不起作用?

我对此感到生气,欢迎任何建议!

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>

* 最终编辑:解决方案*

仅供参考:

在第一个项目中,我添加了servlet配置文件(jpm-servlet.xml)

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

在第二个项目中:

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>

2 个答案:

答案 0 :(得分:1)

从你的问题

  

两个类都在不同的包中,但都加载了,我有两个   context:component-scan,每个项目一个。我发现如果两者兼而有之   类在同一个包(名称)中,它们工作正常(即使在   差异项目)。

似乎第二个项目的MVC上下文根本没有加载或者没有被你的应用程序加载DispatcherServlet。因此,component-scan未加载第二个项目@Controller

确保DispatcherServlet.

加载了上下文

答案 1 :(得分:1)

  

两个类都在不同的包中,但都加载了,我有两个上下文:组件扫描,每个项目一个。我发现如果两个类都在同一个包(名称)中,它们可以正常工作(即使在不同的项目中)。

我想你可能已经找到了问题的根本原因......


请注意,一旦将所有内容合并到一个WAR文件中,“项目”就变得无关紧要了。在执行时,类(等)通过类路径可见......或者它们不是。你可能也会对Maven重叠完成后有效的Spring配置有点困惑。 (去那里,完成了。)因此,请确保检查部署的 webapp中的配置,并根据他们上发生的事情进行推理。


根据证据,我认为问题在于您的某个组件扫描无法正常工作。因此,注释处理器没有看到“缺失”控制器的注释。

作为一项实验,我会尝试“黑客攻击”Spring配置(在部署的webapp上,在第一个实例中)将两个独立的组件扫描组合成一个扫描所有相关软件包的扫描。如果可行,那么弄清楚如何使用Maven覆盖实现相同的最终结果。