Springboot體驗之問題記錄

經過springboot快速構建jar包,這個輕量級的jar能夠很方便的部署至任一有java環境的服務器,便於測試。html

經過eclipse-mars新建一個spring starter project項目。java

1. 在eclipse的嚮導中,新建2.1.5.RELEASE版本的springboot項目,由於選項中包含這個,但是完成以後,在pom.xml的第一行報一個Unknow的錯誤,在problems中顯示spring

Description    Resource    Path    Location    Type
Unknown    pom.xml    /myproject    line 1    Maven Configuration Problemjson

百思不得其解,後面發現將其改爲2.1.4.RELEASE便可。windows

<parent>
    <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.4.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

考慮應該是eclipse的bug,固然也有多是個人環境的問題。springboot

2. 通常新建一個springboot項目都會添加Web依賴,而後通常爲了測試springboot項目是否正常,會寫一個HelloController,這裏要注意幾個容易搞錯的註解。bash

@Controller @RestController服務器

@GetMapping @PostMappingmvc

其實我這裏主要說的就是@Controller @RestController這兩個註解:app

@Controller
public class HelloController {
	
	@RequestMapping("/hello")
	public String hello() {
		return "hello";
	}
}

這樣去訪問localhost:8080/hello獲得的是以下錯誤

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri May 17 16:34:41 CST 2019
There was an unexpected error (type=Internal Server Error, status=500).
Circular view path [hello]: would dispatch back to the current handler URL [/hello] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

是由於hello()方法返回的hello其實會去找hello.html(這裏根據使用的什麼模板,好比用thymeleaf能夠配置.html的視圖)的頁面,由於springmvc的視圖解析會自動加上默認的後綴,就像咱們通常會配置的prefix suffix WEB-INF .jsp等信息。

因此這裏就用到@RestController這個註解,能夠看到它裏面實際上是包含了@ResponseBody這個註解,也就是將hello方法的return的字符當成json直接返回,而不用進行視圖解析。只須要替換以下就能夠,固然GetMapping能夠很方便的知道這是一個get請求,不像RequestMapping還須要經過屬性來區分。

@RestController
public class HelloController {
	
	@GetMapping("/hello")
	public String hello() {
		return "hello";
	}
}

這時,訪問localhost:8080/hello,頁面返回了hello字符串,顯示正常。

3. 因爲用到了靜態資源文件,代碼中須要讀取文件流,一開始我用絕對路徑,在本地測試沒有問題,可是打成jar包丟到服務器去運行時,發現報錯:E:/ssm/workspace-mars/myproject/src/main/resources/static/certs/key-store.p12資源找不到。

打開jar包,發現static資源目錄在BOO-INF/classes/static/

起初用到ResourceUtils工具類,對應於org.springframework.util.ResourceUtils,用到的方法org.springframework.util.ResourceUtils.getFile("classpath:key-store.p12");

後面還用到ClassPathResource類,ClassPathResource resource = new ClassPathResource("key-store.p12");

而後就能夠直接獲取InputStream。

1.File file= ResourceUtils.getFile("classpath:key-store.p12");
2.ClassPathResource classPathResource = new ClassPathResource("key-store.p12");
獲取文件:classPathResource .getFile();
獲取流:classPathResource .getInputStream();
#這裏注意,若是文件不在根目錄下,須要用相對路徑,好比static/certs/key-store.p12
#經過網上查閱資料,知道springboot項目,經過第一種方式在windows下能夠實現,可是放到Linux系統中就找不到File,因此最好是用第二種方式,而後用getInputStream()流的方式來讀取文件。

4. springboot項目從1.5開始不支持log4j,僅支持log4j2。這裏須要配置。

通常日誌咱們採用slf4j在項目中使用接口來調用,而不用關心具體實現類,代碼以下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(ClassName.class);

通常咱們採用log4j做爲實現,只須要配置一個log4j.properties文件

相關文章
相關標籤/搜索