使用Spring boot的官方tutorials可以非常方便的完成spring的示例,示例也非常简单,使用注解直接就完成了RESTful API的开发。但是当这个应用使用tomcat来启动的时候,却产生了404错误。加之使用的是淘宝改动过的tomcat(主页地址),使得寻找问题变得复杂起来。最后,在阅读了官方文档后,饶了几个页面,终于找到了问题所在。无论你是使用的Building a RESTful Web Service的代码,还是使用的官方https://start.spring.io/生成的代码,都是同样的解法。
在pom中进行如下修改,请注意红色部分。
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
找到你的运行的入口类,有类级别的注解 @SpringBootApplication,这个类需要继承自SpringBootServletInitializer并且覆写:
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(AdminApplication.class); } 最终你生成的文件可能看起来如下:
package top.huster; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.web.SpringBootServletInitializer; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController @EnableAutoConfiguration public class AdminApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(AdminApplication.class); } public static void main(String[] args) { SpringApplication.run(AdminApplication.class, args); } }
到这里,再打成war包,放到你的tomcat容器里,就能跑起来了。我的IDEA的配置如下:
下面我们试着分析下,为什么?
1. Spring boot 项目里已经在内嵌了tomcat容器,所以你如果要使用外部的tomcat容器,则需要在pom文件中,将内嵌的tomcat容器写成provided范围。之所以内嵌容器,spring 是为了一个jar文件也能启动一个http服务,而抛弃了繁杂的配置。同时为了让tomcat能够识别,我们把打成的包改成传统的war,默认是jar。这个是我们修改pom的原因。
2. 打出来的包是war包,tomcat也能启起来,但是总是报404错误。这个是由于我们的主类(入口类)并没有被加载,所以后面所有的Control都无法识别和生效。我们通过继承SpringBootServletInitializer让tomcat的serverlet拉起来。
最终参考答案在这里:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file
找到他不容易啊,最初从这里找到他:http://spring.io/guides/gs/convert-jar-to-war/
利用如上特征,我们使用goolge的zxing写一个动态生成二维码的应用,这个二维码不会生成文件,是一次性的
@RequestMapping("/barcode") public void getBarcode(HttpServletResponse response) throws IOException,WriterException { String content = "http://www.huster.top"; BitMatrix matrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, 200, 200 ); try { MatrixToImageWriter.writeToStream(matrix, "GIF", response.getOutputStream()); response.flushBuffer(); } catch (Exception e) { e.printStackTrace(); } }