我对@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>
答案 0 :(得分:1)
从你的问题
两个类都在不同的包中,但都加载了,我有两个 context:component-scan,每个项目一个。我发现如果两者兼而有之 类在同一个包(名称)中,它们工作正常(即使在 差异项目)。
似乎第二个项目的MVC上下文根本没有加载或者没有被你的应用程序加载DispatcherServlet
。因此,component-scan
未加载第二个项目@Controller
。
确保DispatcherServlet.
答案 1 :(得分:1)
两个类都在不同的包中,但都加载了,我有两个上下文:组件扫描,每个项目一个。我发现如果两个类都在同一个包(名称)中,它们可以正常工作(即使在不同的项目中)。
我想你可能已经找到了问题的根本原因......
请注意,一旦将所有内容合并到一个WAR文件中,“项目”就变得无关紧要了。在执行时,类(等)通过类路径可见......或者它们不是。你可能也会对Maven重叠完成后有效的Spring配置有点困惑。 (去那里,完成了。)因此,请确保检查部署的 webapp中的配置,并根据他们上发生的事情进行推理。
根据证据,我认为问题在于您的某个组件扫描无法正常工作。因此,注释处理器没有看到“缺失”控制器的注释。
作为一项实验,我会尝试“黑客攻击”Spring配置(在部署的webapp上,在第一个实例中)将两个独立的组件扫描组合成一个扫描所有相关软件包的扫描。如果可行,那么弄清楚如何使用Maven覆盖实现相同的最终结果。