为什么maven+tomcat插件启动web项目后无法初始化controller类?

问题

现有个web项目, 尝试了两种方式启动:

  • 方式1: 将其部署到Tomcat中, 直接启动tomcat, 能够初始controller类.
  • 方式2: 以maven方式启动, 却不能够初始化controller类. 利用内置的tomcat6, 还是手动添加tomcat7插件均不能成功. 结果是项目能够正常启动, 但是访问controller报404, 因为启动项目时根本就没有初始化controller.

maven方式启动过程:

  1. tomcat7:run命令启动项目
  2. 加载springmvc的Servlet, 加载DispatcherServlet.

    clipboard.png

  3. 放行后, 如果能够加载controller类, 则会跳至controller类的构造方法. Tomcat方式启动能够跳转, 但是maven方式启动, 直接过了, 项目启动结束.

相关配置

web.xml中配置springmvc的前端控制器

    <!-- springmvc前端控制器 -->
    <servlet>
        <servlet-name>mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 加载springmvc核心配置文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:springmvc.xml</param-value>
        </init-param>
        <!-- 框架随着web容器启动而初始化 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- 配置访问拦截的url -->
    <servlet-mapping>
        <servlet-name>mvc</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

springmvc.xml配置

clipboard.png

controller类

@Controller
//@Log4j
public class ItemController {
    public static final Logger log = Logger.getLogger(ItemController.class);
    public ItemController() {
        log.info("com.e3.controller.ItemController.ItemController 初始化...");    //加断点
    }

    @RequestMapping("/foo2")
    @ResponseBody
    public String foo2(){
        System.out.println("ok");    //加断点
        return "ok";
    }
}

pom.xml文件中tomcat7插件配置

      <!--配置tomcat7插件-->
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>

                <configuration>
                    <!--web项目url根路径-->
                    <path>/</path>
                    <!--tomcat运行端口-->
                    <port>8082</port>
                </configuration>
            </plugin>
        </plugins>
阅读 5.4k
2 个回答

把 <load-on-startup>改大一点试一试

问题已解决

初步原因

原来是maven在编译的时候, 没有将resources目录下的.xml文件编译到classes目录下, 导致SpringMvc的Servlet读取不到配置文件. 也就无法初始化controller类了.

至于为什么没有将配置文件放进classes目录下的原因尚不明了.

解决办法

在pom.xml中配置, 指定将resource目录下的文件包含即可.

clipboard.png

注意: <filtering>true</filtering>可能会导致读取xml文件IO异常. 若是, 换成: <filtering>false</filtering>.
这个标签是什么意思, 笔者暂时不知! 有知道的麻烦评论告知, 多谢!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题