2017-08-29 44 views
0

我在上下文初始化时遇到了问题。我不使用xml配置文件。我阅读了许多关于类似问题的文章,但是..我想用不含xml的spring配置,但出现错误。请帮忙解决。在WebMVCConfig资源[/com.chat.config/]中定义名称为'resolver'的bean时出错

`org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resolver' defined in com.chat.config.WebMVCConfig: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.view.InternalResourceViewResolver]: Factory method 'resolver' threw exception; nested exception is java.lang.StackOverflowError 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173) 

这里是我的WebMVCConfig

@Configuration 
    @ComponentScan("com.chat") 
    @EnableWebMvc 
    public class WebMVCConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/scripts/**").addResourceLocations("/scripts/"); 
     registry.addResourceHandler("/styles/**").addResourceLocations("/styles/"); 
     registry.addResourceHandler("/images/**").addResourceLocations("/images/"); 
     registry.addResourceHandler("/fonts/**").addResourceLocations("/fonts/"); 
     registry.addResourceHandler("/pages/**").addResourceLocations("/views/"); 

    } 

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

    } 
    @Bean 
    public InternalResourceViewResolver resolver() { 
     InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 

     resolver().setPrefix("/views/"); 
     resolver().setSuffix(".jsp"); 
     resolver.setViewClass(JstlView.class); 
     return resolver; 
    } 
} 

WebInit

public class WebInit extends 
    AbstractAnnotationConfigDispatcherServletInitializer { 
    // Этот метод должен содержать конфигурации которые инициализируют Beans 
    // для инициализации бинов у нас использовалась аннотация @Bean 
    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[]{ 
       WebMVCConfig.class 
     }; 
    } 

    // Тут добавляем конфигурацию, в которой инициализируем ViewResolver 
    @Override 
    protected Class<?>[] getServletConfigClasses() { 

     return new Class<?>[]{ 
       WebMVCConfig.class 
     }; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[]{"/","/login", "/chat","/dialog","/registration" }; 
    } 

} 

的pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<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 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>MyChat</groupId> 
    <artifactId>MyChat</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>war</packaging> 
<dependencies> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>4.3.8.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-web-api</artifactId> 
     <version>7.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>jstl</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.websocket</groupId> 
     <artifactId>javax.websocket-api</artifactId> 
     <version>1.1</version> 
    </dependency> 
    <dependency> 
     <groupId>taglibs</groupId> 
     <artifactId>standard</artifactId> 
     <version>1.1.2</version> 
    </dependency> 

</dependencies> 

</project> 

回答

0

的错误是在这里:

@Bean 
public InternalResourceViewResolver resolver() { 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 

    resolver().setPrefix("/views/"); 
    resolver().setSuffix(".jsp"); 

您的方法名称为resolver,并且您重复呼叫resolver()。这是一个无限的递归调用。它应该是这个:

@Bean 
public InternalResourceViewResolver resolver() { 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 

    resolver.setPrefix("/views/"); 
    resolver.setSuffix(".jsp"); 
+0

= DDDDDD,ahahaha,THX,人))))也就是说,很多的乐趣))))我一直在解决它2-3个小时..它是如此愚蠢的)谢谢你这么多! –

+0

请再告诉我一件事!默认页面将是“index.jsp”我该如何改变它? 我是对的,现在春天通过路径查找页面:/ webapp/views? 或/ webapp /? –

+0

是的,你是对的。不确定关于默认页面。我想你可以设置一个请求映射到''/“',这将作为默认工作。您也不需要手动指定每个映射。除非你想使用白名单,否则你可以使用'/ **',但是在添加页面时需要大量的维护。 –

相关问题