2017-06-03 43 views
0

我想在我的Spring MVC应用程序中重写ResourceHttpRequestHandler。覆盖ResourceHttpRequestHandler Spring MVC

我有以下类到目前为止:

@Controller 
public class ResourceHttpRequestHandlerReplacer extends ResourceHttpRequestHandler implements BeanFactoryPostProcessor { 

@Override 
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    super.handleRequest(request, response); 
} 

public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) 
     throws BeansException { 
    String[] names = factory.getBeanNamesForType(ResourceHttpRequestHandler.class); 

    for (String name : names) { 
     BeanDefinition bd = factory.getBeanDefinition(name); 
     bd.setBeanClassName("com.project.controllers.ResourceHttpRequestHandlerReplacer"); 
    } 
} 

} 

现在它应该只是调用父类的handleRequest所以没有什么应该已经改变了,但我得到这个消息:

产生的原因: java.lang.IllegalStateException:WebApplicationObjectSupport实例[ResourceHttpRequestHandler [locations = [],resolvers = [[email protected]943e88]]]不会在ServletContext中运行。确保物体已完全配置!

我想重写,以便我可以实现一些自定义逻辑,试图找到非静态但未由控制器映射的资源,因为用户将能够为页面定义URL在他们的CMS。

任何人都可以告诉我哪里出错了吗?

感谢

+1

你应该分裂你自己的处理程序和逻辑取代它。将BeanFactoryPostProcessor的逻辑移动到一个单独的类中,而不是在同一个类中。这些'BeanFactoryPostProcessor'在进程已经设置好之前就运行得很早,但是由于扩展它仍然需要一个'ServletContext'。 –

回答

2

看起来像你的ResourceHttpRequestHandlerReplacer不知道ServletContext的,因为你是从ResourceHttpRequestHandler扩展它是罕见的。尝试添加到您的类

@Autowired 
ServletContext servletContext;