春天DispatchServlet不能在码头找资源(Spring DispatchServlet c

2019-11-03 04:08发布

我看到很多人有类似的问题,但没有回答我的作品。 我在做什么是试图用零配置与Spring 4嵌入码头。 我把我的一些代码下面更好地描述我的问题:

JettyStarter.class

public class JettyStarter {
    ...
    private static final String CONFIG_LOCATION = "com....config";
    private static final String DEFAULT_MAPPING_URL = "/*";
    private static final String DEFAULT_CONTEXT_PATH = "/";
    ...

    private ServletContextHandler getServletContextHandler() throws IOException {
        WebApplicationContext context = getContext();

        ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);

        contextHandler.setErrorHandler(null);
        DispatcherServlet dispatcherServlet = new DispatcherServlet(context);

        ServletHolder servletHolder = new ServletHolder("Servlet Dispatcher", dispatcherServlet);
        servletHolder.setInitOrder(1);
        contextHandler.addServlet(servletHolder, DEFAULT_MAPPING_URL);


        contextHandler.addEventListener(new ContextLoaderListener(context));

        contextHandler.setResourceBase(new ClassPathResource("webapp").getURI().toString());

        contextHandler.setContextPath(DEFAULT_CONTEXT_PATH);

        return contextHandler;
    }

    private void startJetty() throws Exception
    {
        ...
        HandlerCollection handlers = new HandlerCollection();
        handlers.addHandler(getServletContextHandler());
        ...

        server.setHandler(handlers);
        server.start();
        server.join();
    }

    private WebApplicationContext getContext() throws IOException {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation(CONFIG_LOCATION);
        ...
        return context;
}
    ...
}

WebMvcConfig.class

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com...controllers")
public class WebMvcConfig extends WebMvcConfigurerAdapter{
    ...

    @Bean
    public InternalResourceViewResolver getInternalResourceViewResolver()
    {
        InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
        internalResourceViewResolver.setPrefix("/WEB-INF/jsp/view");
        internalResourceViewResolver.setSuffix(".jsp");
        internalResourceViewResolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);
        return internalResourceViewResolver;
    }
}

HomeController.class

@Controller
public class HomeController {
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login(@RequestParam(value="error", required=false) boolean error, ModelMap model) 
    {
        ...
        return "/pub/login";
    }
}

最后,服务器启动后,我得到404错误,出现以下消息尝试访问本地主机:8080 /登录

警告:未发现与URI [/WEB-INF/jsp/view/pub/login.jsp]在DispatcherServlet的名为“servlet调度” HTTP请求映射

我敢肯定的资源为“login.jsp”是包内的文件夹“/ web应用/ WEB-INF / JSP /查看/酒馆”下。 但为什么它保留说,它不能找到?


解:

奇怪的限购令,我不能回答自己8小时内的问题。

通过跟踪在Spring的源代码,我终于得到了我的页面显示。 原因是我设置码头ServletContextHandler的ResourceBase为“Web应用程序”,并在其下创建“WEB-INF”子文件,所有的资源在“WEB-INF / JSP /图/ ...”为好。 但该文件夹WEB-INF是无形的ResourceHttpRequestHandler我们可以看到的代码有:

protected boolean isInvalidPath(String path) {
    return (path.contains("WEB-INF") || path.contains("META-INF") || StringUtils.cleanPath(path).startsWith(".."));
}

所以,解决的办法是改变资源基地“的webapp / WEB-INF”,并更改InternalResourceViewResolver这个前缀为“/ JSP /视图”的可能。 它虽然工作!

现在的问题是,ResourceHttpRequestHandler是由被用来限制直接访问资源,一个servlet不应该使用它,为什么我没有,配置版本加载已知? 但不能用于XML的配置版本? 使用任何其他处理程序通过XML的配置通过这种限制或者我丢失的东西? 欣赏任何人转发。

Answer 1:

你需要告诉Spring,你来注释你的豆。 这通常是在XML做说注解驱动。 但我相信,你将不得不使用@AnnotationDrivenConfig ALON与@Configuration元素,使您得到豆子自动连接。

编辑:作为OP提到@AnnotationDrivenConfig已被弃用。 你可以尝试https://stackoverflow.com/a/8076045/2231632 ?



文章来源: Spring DispatchServlet cannot find resource within Jetty