Eclipse 动态 Web 模块 3.0 的 Apache tomcat 问题

Posted

技术标签:

【中文标题】Eclipse 动态 Web 模块 3.0 的 Apache tomcat 问题【英文标题】:Apache tomcat issue with Eclipse dynamic web module 3.0 【发布时间】:2015-06-12 15:34:12 【问题描述】:

我使用默认配置创建了 Spring MVC 项目,它在服务器上工作/运行,但是当我将 Project Facets 更改为 J2EE 6 时,如下所示: 现在,当我运行项目时,我收到以下消息

更新 请看这个项目结构:Controller.java

@Controller
public class HomeController 

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

/**
 * Simply selects the home view to render by returning its name.
 */
@RequestMapping(method = RequestMethod.GET)
public String home(Locale locale, Model model) 
    logger.info("Welcome home! The client locale is .", locale);

    Date date = new Date();
    DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

    String formattedDate = dateFormat.format(date);

    model.addAttribute("serverTime", formattedDate );

    return "home";


新控制台输出没有任何错误是:

2015 年 6 月 20 日下午 6:33:38 org.apache.catalina.core.ApplicationContext 日志 信息:初始化 Spring 根 WebApplicationContext 信息:org.springframework.web.context.ContextLoader - Root WebApplicationContext:初始化开始 信息:org.springframework.web.context.support.XmlWebApplicationContext - 刷新根 WebApplicationContext:启动日期 [2015 年 6 月 20 日星期六 18:33:38 PKT];上下文层次的根 信息:org.springframework.beans.factory.xml.XmlBeanDefinitionReader - 从 ServletContext 资源 [/WEB-INF/spring/root-context.xml] 加载 XML bean 定义 信息:org.springframework.beans.factory.support.DefaultListableBeanFactory - 在 org.springframework.beans.factory.support.DefaultListableBeanFactory@1a8f100 中预实例化单例:定义 beans [];工厂层次结构的根 信息:org.springframework.web.context.ContextLoader - Root WebApplicationContext:初始化在 893 毫秒内完成 2015 年 6 月 20 日下午 6:33:39 org.apache.catalina.core.ApplicationContext 日志 信息:初始化 Spring FrameworkServlet 'appServlet' 信息:org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'appServlet':初始化开始 信息:org.springframework.web.context.support.XmlWebApplicationContext - 为命名空间“appServlet-servlet”刷新 WebApplicationContext:启动日期 [2015 年 6 月 20 日星期六 18:33:39 PKT];父级:根 WebApplicationContext 信息:org.springframework.beans.factory.xml.XmlBeanDefinitionReader - 从 ServletContext 资源加载 XML bean 定义 [/WEB-INF/spring/appServlet/servlet-context.xml] 信息:org.springframework.context.annotation.ClassPathBeanDefinitionScanner - JSR-250 'javax.annotation.ManagedBean' 找到并支持组件扫描 信息:org.springframework.context.annotation.ClassPathBeanDefinitionScanner - JSR-330 'javax.inject.Named' 注释找到并支持组件扫描 信息:org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' 发现并支持自动装配注释 信息:org.springframework.beans.factory.support.DefaultListableBeanFactory - 在 org.springframework.beans.factory.support.DefaultListableBeanFactory@1c047f0 中预实例化单例:定义 bean [org.springframework.web.servlet.mvc.method.annotation. RequestMappingHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org. springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0,org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#0,org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#0,org. springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,org.springframework.web.servlet.resource.Resou rceHttpRequestHandler#0,org.springframework.web.servlet.handler.SimpleUrlHandlerMapping#0,org.springframework.web.servlet.view.InternalResourceViewResolver#0,homeController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context。 annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0];父级:org.springframework.beans.factory.support.DefaultListableBeanFactory@1a8f100 信息:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 映射“[/],methods=[GET],params=[],headers=[],consumes=[],produces=[] ,custom=[]" 到公共 java.lang.String home.com.web.HomeController.home(java.util.Locale,org.springframework.ui.Model) 信息:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - 将 URL 路径 [/resources/**] 映射到处理程序 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0' 信息:org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'appServlet':初始化在 2619 毫秒内完成

http://localhost:8080 也显示 HTTP 状态 404 在这种情况下有什么提示吗?我该怎么办?

【问题讨论】:

tomcat日志包含什么?任何可能指向原因的错误? 1/ 服务器启动并正确加载应用程序上下文? 2/ 您检查部署程序集是否正确? 请查看我的更新控制台输出 我也在使用相同的版本,面临同样的问题,如果有人处理这个问题会很有帮助 这是什么意思“当 Project Facet 设置为 Dynamic Web Module 3.0 并且 localhost 也无法正常工作时,Apache Tomcat 7 不工作我需要一个可靠的答案来解决这个问题。”?你会得到哪些错误。顺便提一句。 “Eclipse Dynamic Web Facette”或 Tomcat 服务器出现问题与您的问题中描述的问题完全不同。 【参考方案1】:

您的问题与eclipse或eclipse中的动态web模块无关,除了存在不止一个问题。您的弹簧配置存在一般性问题。

您正在尝试通过 RequestMapping 映射“/” - 即使在 Spring MVC 4.1.6 中也不起作用 - 独立于 eclipse 或动态 Web 模块。

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
- 映射“[/],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]”
到公共 java.lang.String sd.sdse.dsdds.HomeController.home(java.util.Locale,org.springframework.ui.Model)

spring.io 论坛中有更多类似的关于如何定义到上下文根的映射的问题,例如"@RequestMapping pointing to /"

您通过将 Spring Dispatcher Servlet 映射到“/”而不是“/*”来归档它 并从 @RequestMapping 注释中删除到“/”的显式映射。

您shared 的项目不是生成日志输出的项目。该项目在 Tomcat 上部署和执行时甚至不会启动 SpringContext。

要启动 SpringContext,您必须在 web.xml 中配置 ContextLoadListener 和/或 DispatcherServlet 喜欢这里:

<display-name>Home</display-name>
   <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/servlet-config.xml</param-value>
</context-param>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value></param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> 

或者你需要一个像这样实现WebApplicationInitializer接口的类:

public class WebAppInitializer implements WebApplicationInitializer 

    @Override
    public void onStartup(ServletContext context) 
        XmlWebApplicationContext rootContext = 
                new XmlWebApplicationContext();
        rootContext.setConfigLocation("/WEB-INF/spring/root-context.xml");

        context.addListener(new ContextLoaderListener(rootContext));

        // Create the dispatcher servlet's Spring application context
        XmlWebApplicationContext servletContext = 
                new XmlWebApplicationContext();
        servletContext.setConfigLocation("/WEB-INF/spring/appServlet/servlet-context.xml");

        // add the dispatcher servlet and map it to /
        ServletRegistration.Dynamic dispatcher = 
                context.addServlet("springDispatcher", new DispatcherServlet(servletContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");

    


从您在项目中使用的位置加载弹簧配置文件(root-context.xmlservlet-context.xml)。

使用WebApplicationInitializer 的固定版本可以在github 上找到。我已经向你发送了一个拉取请求。

固定版本的控制台输出为:

信息:org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' 发现并支持自动装配注释 信息:org.springframework.beans.factory.support.DefaultListableBeanFactory - 在 org.springframework.beans.factory.support.DefaultListableBeanFactory@76dc331c 中预实例化单例:定义 bean [org.springframework.web.servlet.mvc.method.annotation. RequestMappingHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org. springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0,org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#0,org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#0,org. springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,org.springframework.web.servlet.resource.Reso urceHttpRequestHandler#0,org.springframework.web.servlet.handler.SimpleUrlHandlerMapping#0,org.springframework.web.servlet.view.InternalResourceViewResolver#0,homeController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context。 annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0];父级:org.springframework.beans.factory.support.DefaultListableBeanFactory@5c23f9fd 信息:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 映射“[],methods=[GET],params=[],headers=[],consumes=[],produces=[], custom=[]" 到公共 java.lang.String com.dom.son.HomeController.home(java.util.Locale,org.springframework.ui.Model) 信息:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - 将 URL 路径 [/resources/**] 映射到处理程序 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0' 信息:org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'springDispatcher':初始化在 430 毫秒内完成 2015 年 6 月 21 日下午 12:45:28 org.apache.coyote.AbstractProtocol 开始 信息:启动 ProtocolHandler ["http-bio-8080"] 2015 年 6 月 21 日下午 12:45:28 org.apache.coyote.AbstractProtocol 开始 信息:启动 ProtocolHandler ["ajp-bio-8009"] 2015 年 6 月 21 日下午 12:45:28 org.apache.catalina.startup.Catalina 开始 信息:服务器在 2048 毫秒内启动 信息:com.dom.son.HomeController - 欢迎回家!客户端语言环境是 de_DE。

为了解决你的eclipse问题,我建议从eclipse中删除旧项目并从github重新导入固定版本。

在 Eclipse 中:

Servers 视图中停止您的Tomcat 实例。 从 Tomcat 中删除部署(上下文菜单 -> 删除) 删除项目(最好将其从磁盘中删除,或将其移至其他位置) 查看固定版本(我的或你的我的更改) 重新导入固定版本(文件 -> 导入.... -> Maven -> 现有 Maven 项目)

【讨论】:

感谢您宝贵的时间/考虑我的 致命问题 我一直在关注 This Video,我在 web.xml 中看不到任何内容,但您有加了一堆线? 重要 我是这个世界的新手,如果有的话,不要对我愚蠢的cmets感到困惑! 从 Servlet Spec 3.0 开始,web.xml 文件不再是强制性的。这一切都可以通过注释来完成,... 视频显示,如果没有跳过基本部分,一个简单的 JSP 应用程序。您正在尝试构建一个 Spring MVC 应用程序,它们在很多方面都不同。如前所述,这一切都可以通过注释完成,重要的是从@RequestMapping 中删除/。根据日志有一个。如果这不起作用,请使用您的配置/映射更新您的问题。 我仍然面临 HTTP 404 问题查看我的更新! 但是我没有看到任何/servlet-config.xm 显示在&lt;param-value&gt;/WEB-INF/servlet-config.xml&lt;/param-value&gt; 什么意思你看不到任何servlet-config.xml。你在看哪里?您的项目有一个。在我看来,在一个奇怪的地方,但根据你的截图它存在。你仍然得到一个 404 并不奇怪 - 日志输出仍然说定义了“/”的映射 - 你的控制器源告诉了一些不同的东西你可以尝试清理和重建整个项目和/或强制重新部署您的应用程序。您也可以在您的项目中搜索"/"。您也可以尝试使用我的 github 项目作为起点,或者在某处分享您的项目。

以上是关于Eclipse 动态 Web 模块 3.0 的 Apache tomcat 问题的主要内容,如果未能解决你的问题,请参考以下文章

无法将项目方面动态 Web 模块的版本更改为 3.0?

eclipse报错Dynamic Web Module 3.0 requires Java 1.6

动态 Web 模块 3.0 -- 3.1

Maven 创建动态web 3.0项目

eclipse中Cannot change version of project facet Dynamic Web Module to 3.0的问题解决

eclipse部署Tomcat6 : The server does not support version 3.0 of the JEE Web module specification