如何以编程方式允许端点的GET方法?

时间:2017-03-04 10:29:25

标签: spring spring-mvc spring-boot

我正在加载S2文件并将其作为Web应用程序添加到嵌入式Tomcat服务器。

.war

到目前为止这是有效的,但如果我访问http://localhost:8080/web我正在

@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {

    LOGGER.info("Adding web app");

    return new TomcatEmbeddedServletContainerFactory() {

        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {

            String appHome = System.getProperty(Environment.APP_HOME);

            String targetFileName = "web-0.0.1-SNAPSHOT.war";
            InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(targetFileName);

            LOGGER.info(System.getProperty("user.name"));
            LOGGER.debug("Loading WAR from " + appHome);

            File target = new File(Paths.get(appHome, targetFileName).toString());

            try {

                LOGGER.info(String.format("Copy %s to %s", targetFileName, target.getAbsoluteFile().toPath()));
                java.nio.file.Files.copy(resourceAsStream, target.getAbsoluteFile().toPath(), StandardCopyOption.REPLACE_EXISTING);

                Context context = tomcat.addWebapp("/", target.getAbsolutePath());
                context.setParentClassLoader(getClass().getClassLoader());

            } catch (ServletException ex) {
                throw new IllegalStateException("Failed to add webapp.", ex);
            } catch (Exception e) {
                throw new IllegalStateException("Unknown error while trying to load webapp.", e);
            }

            return super.getTomcatEmbeddedServletContainer(tomcat);
        }
    };
}

和回复

2017-03-04 11:18:59.588  WARN 29234 --- [nio-8080-exec-2] o.s.web.servlet.PageNotFound             : Request method 'GET' not supported

我确信我所要做的就是在Allow: POST Content-Length: 0 Date: Sat, 04 Mar 2017 10:26:16 GMT 上允许GET方法,并希望通过网络浏览器可以访问已加载的/web文件提供的静态网页内容。

我如何/在哪里配置端点,以便它允许war个请求?

我尝试按照this tutorial中的描述引入GET

WebController

在日志输出中,我可以看到这是正确映射的:

@Controller
public class WebController {

   private final static Logger LOGGER = Logger.getLogger(WebController.class);

   @RequestMapping(value = "/web", method = RequestMethod.GET)
   public String index() {
       LOGGER.info("INDEX !");
       return "index";
   }
}

但它并没有改变我无法访问该网站的事实。

我还配置了RequestMappingHandlerMapping : Mapped "{[/web],methods=[GET]}" onto public java.lang.String org.ema.server.spring.controller.dl4j.WebController.index()

InternalResourceViewResolver

的web.xml

由于我在纯Java中配置了所有内容,因此该文件没有很多定义:

@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter {

    private final static Logger LOGGER = Logger.getLogger(MvcConfiguration.class);

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        LOGGER.info("configureViewResolvers()");
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();

        resolver.setSuffix(".html");
        registry.viewResolver(resolver);
    }


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

}

重现

如果您想重现这一点,只需结帐the entire code from github即可。所有你需要这样做:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <display-name>Easy Model Access Server</display-name>

    <listener>
        <listener-class>org.ema.server.ServerEntryPoint</listener-class>
    </listener>

    <context-param>
        <param-name>log4j-config-location</param-name>
        <param-value>WEB-INF/classes/log4j.properties</param-value>
    </context-param>

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/web/*.html</url-pattern>
    </servlet-mapping>

</web-app>

这将克隆,构建和运行服务器。

目前需要目录mkdir ~/.ema git clone https://github.com/silentsnooc/easy-model-access cd easy-model-access/ema-server mvn clean install java -jar server/target/server-*.jar 目录。这是在服务器启动时复制WAR的位置。

2 个答案:

答案 0 :(得分:1)

我的猜测是你的web.xml将任何路径映射到Spring DispatcherServlet,如:

<servlet>
  <servlet-name>app</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

由于<url-pattern>/</url-pattern>任何请求必须由Spring控制器处理,因此Tomcat不提供静态文件。像/*.html这样的模式也会产生同样的效果。

如果您只有几页,则可以为预定义的default servlet添加一个或多个映射,之前映射Spring(如果使用它,也可以在Spring Security之前) ):

 <servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>index.html</url-pattern>
 </servlet-mapping>

您也可以使用<url-pattern>*.html</url-pattern>,或者,如果您的资源位于web路径下,并且那里只有静态资源:<url-pattern>/web/*</url-pattern>

也许所有这些都是在你在web.xml中作为监听器的org.ema.server.ServerEntryPoint中的Java代码中完成的

我认为我在web.xml中写的映射是在类getServletMappings的方法org.ema.server.spring.config.AppInitializer中完成的,我将其更改为使用更严格的模式 /rest-api/*而不是/,不确定模式是否正确,其他一切正常,但现在http://127.0.0.1:8080/index.html正常工作

   @Override
protected String[] getServletMappings() {
    return new String[] { "/rest-api/*" };
}

答案 1 :(得分:-1)

我看到网址:http://localhost:8080/web错了。 您可以尝试:http://localhost:8080/[name-of-war-file]/web