2014-03-06 142 views
2

我想从spring webapp设置一个简单的响应主体。 我的问题很简单,就是给出一个web错误。Spring MVC Java配置

我的pom.xml的是:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>pt.dummy</groupId> 
    <artifactId>dummy</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>dummy Maven Webapp</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
     <spring-framework.version>3.2.3.RELEASE</spring-framework.version> 
     <tomcat.servlet.version>7.0.42</tomcat.servlet.version> 
     <log4j.version>1.7.5</log4j.version> 
     <java.version>1.7</java.version> 
     <junit.version>4.11</junit.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>${junit.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-core</artifactId> 
      <version>${tomcat.servlet.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-logging-juli</artifactId> 
      <version>${tomcat.servlet.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-jasper</artifactId> 
      <version>${tomcat.servlet.version}</version> 
      <exclusions> 
       <exclusion> 
        <groupId>org.eclipse.jdt.core.compiler</groupId> 
        <artifactId>ecj</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${spring-framework.version}</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${spring-framework.version}</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.0.1</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <finalName>dummy</finalName> 
     <testResources> 
      <testResource> 
      <!-- declared explicitly so Spring config files can be placed next to their corresponding JUnit test class 
       (see example with ValidatorTests) --> 
      <directory>${project.basedir}/src/test/java</directory> 
      </testResource> 
      <testResource> 
      <directory>${project.basedir}/src/test/resources</directory> 
      </testResource> 
     </testResources> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>${java.version}</source> 
        <target>${java.version}</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

我的网络初始化是:

package dummy.web.config; 

import javax.servlet.Filter; 

import org.springframework.web.filter.CharacterEncodingFilter; 
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 

public class WebAppInitializer extends 
     AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
     protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[] { CoreConfig.class }; 
     } 

    @Override 
     protected Class<?>[] getServletConfigClasses() { 
     return new Class<?>[] { WebConfig.class }; 
     } 

    @Override 
     protected String[] getServletMappings() { 
     return new String[] { "/" }; 
     } 

     @Override 
     protected Filter[] getServletFilters() { 

     CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); 
     characterEncodingFilter.setEncoding("UTF-8"); 
     return new Filter[] { characterEncodingFilter}; 
     } 

} 

核心配置:

package dummy.web.config; 

import org.springframework.context.annotation.Configuration; 

@Configuration 
public class CoreConfig { 

} 

Web配置:

package dummy.web.config; 

import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = {"dummy.web.controller"}) 
public class WebConfig { 

} 

站点控制器:

package dummy.web.controller; 

//import org.slf4j.Logger; 
//import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 

@Controller 
@RequestMapping("/") 
public class SiteController { 

// private static final Logger LOG = LoggerFactory.getLogger(SiteController.class); 

    @RequestMapping(method = RequestMethod.GET) 
    @ResponseBody 
    public String getHome() { 
//  LOG.debug("Home to ResponseBody"); 
     return "Response Body"; 
    } 
} 

任何人都可以表明有必要进行修改补充,使这项工作?

+0

什么是简单的网页错误? –

+0

这个开发的预期结果是一个带有以下文本的网页:'Response Body' – Deceiver

+0

你没有'bes-calypso-web'的url映射 –

回答

6

我相信这是因为Tomcat。 Web上的大多数教程都将spring mvc servlet直接放在应用程序上下文中。它从来没有为我工作。

在Tomcat7上(即使使用XML配置),您必须创建两个上下文:一个用于整个应用程序,另一个用于spring web mvc。它与事件有关

@RequestMapping("/") 

服务器将“/”映射分配给默认的内置servlet。这是你想要他(或她)做的事情。但是你也需要Spring MVC来映射“/”。

也许他们(架构师)认为springmvc是一个特定的servlet,不应该映射根状态。相反,它应该在他自己的映射下(例如“/ springmvc /”)。然后,它期望我们有一个真正的调度程序,它在springmvc和其他任何servlet之间进行调度。

由于一些神奇的原因,在Tomcat 7.0.29中,如果试图劫持“/”,它甚至不能“派遣”。在最近的版本中,映射“/”可以工作。但是为此,您需要一个单独的web mvc上下文/根上下文。

我不使用AbstractAnnotationConfigDispatcherServletInitializer,您必须翻译下面的代码。 这是从本教程适用于迁移从XML到Javaconfig spring-app-migration-from-xml-to-java-based-config

public class WebInit implements WebApplicationInitializer { 

    private static final String DISPATCHER_SERVLET_NAME = "spring-mvc"; 
    private static final String DISPATCHER_SERVLET_MAPPING = "/"; 

    @Override 
    public void onStartup(ServletContext servletContext) 
      throws ServletException {  

     //If you want to use the XML configuration, comment the following two lines out. 
     AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext(); 
     appContext.register(CoreConfig.class); 
     appContext.setDisplayName("removed customer name");  

     //If you want to use the XML configuration, uncomment the following lines. 
     //XmlWebApplicationContext rootContext = new XmlWebApplicationContext(); 
     //rootContext.setConfigLocation("classpath:mvc-servlet.xml"); 

     AnnotationConfigWebApplicationContext mvcContext = new AnnotationConfigWebApplicationContext(); 
     mvcContext.register(ServletConfig.class); 

     ServletRegistration.Dynamic springmvc = 
       servletContext.addServlet(DISPATCHER_SERVLET_NAME, 
          new DispatcherServlet(mvcContext)); 
     springmvc.setLoadOnStartup(1); 
     springmvc.addMapping(DISPATCHER_SERVLET_MAPPING); 

     EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD); 

     CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); 
     characterEncodingFilter.setEncoding("UTF-8"); 
     characterEncodingFilter.setForceEncoding(true); 

     FilterRegistration.Dynamic characterEncoding = servletContext.addFilter("characterEncoding", characterEncodingFilter); 
     characterEncoding.addMappingForUrlPatterns(dispatcherTypes, true, "/*"); 

     FilterRegistration.Dynamic security = servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy()); 
     security.addMappingForUrlPatterns(dispatcherTypes, true, "/*"); 

     servletContext.addListener(new ContextLoaderListener(appContext)); 
    } 
+0

在我的情况是因为我使用的是Tomcat 7.0.12版本。谢谢 – Deceiver