2014-12-20 4 views
0

Я только начинаю работать с Spring 4. Я хочу настроить проект Spring 4 MVC с настройкой java. Я использую IntelliJ Idea 13.1.6. Сначала я создаю новый проект Spring 4 MVC из шаблона Spring MVC 3.2. Затем я добавляю свои файлы конфигурации Spring Spring, но когда я запускаю приложение, его шоу «Hello world» от контроллера шаблона hello вместо моего Home controller. Вот моя структура проекта:Spring 4 HTTP status 404

enter image description here

А вот мои файлы проекта:

HelloController:

package com.spitter.mvc; 

import org.springframework.stereotype.Controller; 
import org.springframework.ui.ModelMap; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

@Controller 
@RequestMapping("/") 
public class HelloController { 
    @RequestMapping(method = RequestMethod.GET) 
    public String printWelcome(ModelMap model) { 
     model.addAttribute("message", "Hello world!"); 
     return "hello"; 
    } 
} 

RootConfig:

package spittr.config; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.ComponentScan.Filter; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.FilterType; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
@Configuration 
@ComponentScan(basePackages={"spitter"}, 
     excludeFilters={ 
       @Filter(type=FilterType.ANNOTATION, value=EnableWebMvc.class) 
     }) 
public class RootConfig { 
} 

SpittrWebAppInitializer:

package spittr.config; 
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 
public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 
    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 
    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[] { RootConfig.class }; 
    } 
    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class<?>[] { WebConfig.class }; 
    } 
} 

HomeController:

package spittr.web; 
import static org.springframework.web.bind.annotation.RequestMethod.*; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

@Controller 
public class HomeController { 
    @RequestMapping(value="/", method=GET) 
    public String home() { 
     return "home"; 
    } 
} 

MVC-диспетчерская-servlet.xml:

<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.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:component-scan base-package="com.spitter.mvc"/> 

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/pages/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

</beans> 

веб-app.xml:

<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

    <display-name>Spring MVC Application</display-name> 

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

    <servlet-mapping> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

Spitter.iml:

<?xml version="1.0" encoding="UTF-8"?> 
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> 
    <component name="FacetManager"> 
    <facet type="web" name="Web"> 
     <configuration> 
     <descriptors> 
      <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml" /> 
     </descriptors> 
     <webroots> 
      <root url="file://$MODULE_DIR$/src/main/webapp" relative="/" /> 
     </webroots> 
     <sourceRoots> 
      <root url="file://$MODULE_DIR$/src/main/resources" /> 
      <root url="file://$MODULE_DIR$/src/main/java" /> 
     </sourceRoots> 
     </configuration> 
    </facet> 
    <facet type="Spring" name="Spring"> 
     <configuration /> 
    </facet> 
    </component> 
    <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false"> 
    <output url="file://$MODULE_DIR$/target/classes" /> 
    <output-test url="file://$MODULE_DIR$/target/test-classes" /> 
    <content url="file://$MODULE_DIR$"> 
     <sourceFolder url="file://$MODULE_DIR$/src/test/resources" isTestSource="true" /> 
     <sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" /> 
     <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> 
     <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> 
     <excludeFolder url="file://$MODULE_DIR$/target" /> 
    </content> 
    <orderEntry type="inheritedJdk" /> 
    <orderEntry type="sourceFolder" forTests="false" /> 
    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test-mvc:1.0.0.M2" level="project" /> 
    <orderEntry type="library" scope="PROVIDED" name="Tomcat 8.0.151" level="application_server_libraries" /> 
    <orderEntry type="library" name="Maven: org.springframework:spring-core:3.2.0.RELEASE" level="project" /> 
    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.1" level="project" /> 
    <orderEntry type="library" name="Maven: org.springframework:spring-web:3.2.0.RELEASE" level="project" /> 
    <orderEntry type="library" name="Maven: org.springframework:spring-context:3.2.0.RELEASE" level="project" /> 
    <orderEntry type="library" name="Maven: org.springframework:spring-aop:3.2.0.RELEASE" level="project" /> 
    <orderEntry type="library" name="Maven: aopalliance:aopalliance:1.0" level="project" /> 
    <orderEntry type="library" name="Maven: org.springframework:spring-beans:3.2.0.RELEASE" level="project" /> 
    <orderEntry type="library" name="Maven: org.springframework:spring-expression:3.2.0.RELEASE" level="project" /> 
    <orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet.jsp:jsp-api:2.1" level="project" /> 
    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:3.2.0.RELEASE" level="project" /> 
    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:3.2.0.RELEASE" level="project" /> 
    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.8.2" level="project" /> 
    <orderEntry type="library" name="Maven: javax.servlet:jstl:1.2" level="project" /> 
    </component> 
</module> 

Почему этот код не запускает домашний контроллер, но hello controller insdead и как его исправить?

Я подозреваю, что что-то не так с файлом Spitter.iml и весной, посмотрите только конфигурацию web.xml вместо конфигурации класса java.

+2

Вы должны попытаться сузить его до наименьшего кода, который воспроизводит вашу проблему. Sinco, проходящий через весь ваш код, является проектом самостоятельно! –

+0

Ваши контроллеры используют один и тот же путь сопоставления запросов. – JamesB

+0

Нет, это не так. Когда я изменяю сопоставление запросов в контроллере hello на @RequestMapping («/ hello»), я получаю HTTP-статус 404 :( – Sayaki

ответ

1

Основная проблема, которую я вижу, - это конфигурация и некоторые мелкие детали. В вашем примере вы используете два способа настройки проекта (Java и XML). Я предпочитаю использовать конфигурацию на основе Java, ее можно комбинировать, но не вызывать конфликтов.

Ваш пример запускает HelloController, потому что он указан в mvc-dispatcher-servlet.xml с базовым пакетом.

<context:component-scan base-package="com.spitter.mvc"/> 

И кроме того, SpittrWebAppInitializer заменить на web.xml. Вы должны удалить файлы XML и изменить RootConfig, чтобы указать правильный пакет.

@ComponentScan(basePackages={"spittr"} 

И WebConfig так быть подобным этому.

@Configuration 
@EnableWebMvc 
@ComponentScan("spittr.web") 
public class WebConfig extends WebMvcConfigurerAdapter { 

    // Configure a JSP view resolver 
    @Bean 
    public ViewResolver viewResolver() { 
     InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
     resolver.setViewClass(JstlView.class); 
     resolver.setPrefix("/WEB-INF/pages/"); 
     resolver.setSuffix(".jsp"); 
     return resolver; 
    } 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     // TODO Auto-generated method stub 
     super.addResourceHandlers(registry); 
    } 
} 

И вы можете иметь только уникальные пути в контроллерах, например, если добавить к WebConfig пакет com.spitter.mvc к @ComponentScan у вас будет ошибка.