【问题标题】:ApplicationObjectSupport instance [org.springframework.web.servlet.view.InternalResourceViewResolver@6d5f2797] does not run in an ApplicationContextApplicationObjectSupport 实例 [org.springframework.web.servlet.view.InternalResourceViewResolver@6d5f2797] 不在 ApplicationContext 中运行
【发布时间】:2017-06-21 16:46:03
【问题描述】:

我想实现不同的视图分辨率策略,所以我这样做了

public class MultiViewResolver implements ViewResolver {
    private Map<String,ViewResolver> resolverMap = new HashMap<>();

public void setResolverMap(Map<String, ViewResolver> resolverMap) {
    this.resolverMap = resolverMap;
}

@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
    try {
        String[] viewNameAndSuffix = viewName.split("\\.");
        ViewResolver resolver = resolverMap.get(viewNameAndSuffix[1]);
        return resolver.resolveViewName(viewNameAndSuffix[0], locale);
    }catch (Exception e) {
        System.out.println(e.getMessage());
        return null;
    }
}
}

@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses = ControllerMarkInterface.class)
public class ServletConfig extends WebMvcConfigurerAdapter{
    @Bean
    public ViewResolver viewResolver(){
        MultiViewResolver multiViewResolver = new MultiViewResolver();
        InternalResourceViewResolver jspViewResolver = new InternalResourceViewResolver();
        jspViewResolver.setPrefix("/WEB-INF/JSP/");
        jspViewResolver.setSuffix(".jsp");
        jspViewResolver.setExposeContextBeansAsAttributes(true);
        InternalResourceViewResolver htmlViewResolver = new InternalResourceViewResolver();
        htmlViewResolver.setPrefix("/WEB-INF/HTML/");
        htmlViewResolver.setSuffix(".html");

        Map<String,ViewResolver> resolverMap = new HashMap<>();
        resolverMap.put("jsp", jspViewResolver);
        resolverMap.put("html", htmlViewResolver);
        multiViewResolver.setResolverMap(resolverMap);
        return multiViewResolver;
    }

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

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

当我这样做时,控制台输出“ApplicationObjectSupport instance [org.springframework.web.servlet.view.InternalResourceViewResolver@39d8e214] does not run in an ApplicationContext

然后,我使用 .xml 来配置 viewResolver,它运行良好,为什么?为什么? 如果我想用java来配置viewResolver,我该怎么做?

<bean id="viewResolver" class="com.demo.config.MultiViewResolver">
     <property name="resolverMap">
         <map>
             <entry key="jsp">
                 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
                     <property name="contentType" value="text/html" />
                     <property name="prefix" value="/WEB-INF/JSP/" />
                     <property name="suffix" value=".jsp" />
                 </bean>
             </entry>

         <entry key="html">
             <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
                <property name="contentType" value="text/html" />
                <property name="prefix" value="/WEB-INF/HTML/" />
                <property name="suffix" value=".html" />
             </bean>
         </entry>
     </map>
 </property>

【问题讨论】:

  • 看起来问题是因为InternalResourceViewResolver jspViewResolver = new InternalResourceViewResolver();InternalResourceViewResolver htmlViewResolver = new InternalResourceViewResolver();。由于InternalResourceViewResolver 由spring 管理,您可以直接在ServletConfig 类中自动装配它,例如@Autowired private InternalResourceViewResolver htmlViewResolver;@Autowired private InternalResourceViewResolver jspViewResolver;
  • @harshavmb 你可以把它放在答案中。

标签: spring spring-mvc servlets


【解决方案1】:

看起来问题是因为InternalResourceViewResolver jspViewResolver = new InternalResourceViewResolver();InternalResourceViewResolver htmlViewResolver = new InternalResourceViewResolver();

由于 InternalResourceViewResolver 由 spring 管理,您可以直接在 ServletConfig 类中自动装配它,如下所示。 Spring 将注入实例。

@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses = ControllerMarkInterface.class)
public class ServletConfig extends WebMvcConfigurerAdapter{

    @Autowired
    private InternalResourceViewResolver jspViewResolver;

    @Autowired
    private InternalResourceViewResolver htmlViewResolver;

    @Bean
    public ViewResolver viewResolver(){
        MultiViewResolver multiViewResolver = new MultiViewResolver();
        jspViewResolver.setPrefix("/WEB-INF/JSP/");
        jspViewResolver.setSuffix(".jsp");
        jspViewResolver.setExposeContextBeansAsAttributes(true);
        htmlViewResolver.setPrefix("/WEB-INF/HTML/");
        htmlViewResolver.setSuffix(".html");

        Map<String,ViewResolver> resolverMap = new HashMap<>();
        resolverMap.put("jsp", jspViewResolver);
        resolverMap.put("html", htmlViewResolver);
        multiViewResolver.setResolverMap(resolverMap);
        return multiViewResolver;
    }

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

希望这会有所帮助!

【讨论】:

  • 谢谢!我尝试了它,但它不起作用,抛出“没有为依赖找到类型 [org.springframework.web.servlet.view.InternalResourceViewResolver] 的合格 bean:预计至少有 1 个 bean 有资格作为此依赖的自动装配候选者”。然后,我喜欢这样,这是工作 @Bean public ViewResolver jspViewResolver(){ InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/JSP/"); resolver.setSuffix(".jsp"); resolver.setExposeContextBeansAsAttributes(true);返回解析器; }
  • 不。不要使用“新”。在带有 Autowired 的 'InternalResourceViewResolver' 实例上使用 @Qualifier 注释,例如 Qualifier("jspViewResolver") 和 Qualifier("htmlViewResolver") 注释
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 2014-01-31
  • 2020-11-20
  • 2015-08-28
  • 1970-01-01
  • 2023-04-11
  • 2014-01-21
相关资源
最近更新 更多