抱歉,如果这感觉重复,我收集了很多人问这个问题,但我一直无法找到有效的答案。
我有一个使用 maven 构建的网络应用程序。我使用 Spring 4 MVC 来提供 RESTful Json API。我还有很多静态内容(html、css、js),如果我使用 Angular.js 在数据 API 上添加漂亮的面孔。
对于我的生活,我无法弄清楚如何在不弄乱它们的路径的情况下同时获得这两种服务。
我真的很想
{APP_ROOT}/people/{id}
在我的浏览器中访问,直接与我的 REST api 交互,没有任何废话/api/
或/rest/
我真的很想
{APP_ROOT}/css/style.css
在我的浏览器中访问,并从src/main/webapp/css/style.css
没有任何废话的情况下获得内容resources
或static
此外,我真的很想用带注释的 Java 类来配置所有这些,并且没有任何
web.xml
,application-context.xml
等。
因此,Spring 调度程序 servlet 应该处理所有 REST 资源路径,然后回退到静态内容的默认 Tomcat/Jetty 处理程序。我认为这正是default-servlet-handler的用途?我似乎无法让它工作。
这些是我的相关配置类:
WebAppInitializer.java
public class WebAppInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[0] ;
}
@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};
}
}
WebConfig.java
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"my.example.package"})
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
使用此配置,我可以与 REST api 交互,但不能与静态内容交互。默认的 servlet 处理程序似乎没有任何效果。