一、處理multipart形式的數(shù)據(jù)
- 配置multipart解析器
從Spring 3.1開(kāi)始衫哥, Spring內(nèi)置了兩個(gè)MultipartResolver的實(shí)現(xiàn)供我們選擇:
- CommonsMultipartResolver: 使用Jakarta Commons FileUpload解析multipart請(qǐng)求;
- StandardServletMultipartResolver: 依賴(lài)于Servlet 3.0對(duì)multipart請(qǐng)求的支持(始于Spring 3.1) 襟锐。
StandardServletMultipartResolver是最佳的選擇撤逢,但是如果我們需要將應(yīng)用部署到非Servlet 3.0的容器中, 那么就得需要替代的方案粮坞。 Spring內(nèi)置了CommonsMultipartResolver蚊荣, 可以作為StandardServletMultipartResolver的替代方案。(配置方式見(jiàn)p257)
使用StandardServletMultipartResolver:
聲明為bean莫杈,添加到在Spring應(yīng)用上下文中
@Bean
public MultipartResolver multipartResolver() throws IOException {
return new StandardServletMultipartResolver();
}
在Servlet中指定multipart的配置
使用Servlet初始化類(lèi)
@Override protected void customizeRegistration(Dynamic registration) { registration.setMultipartConfig( new MultipartConfigElement("/tmp/spittr/uploads", 2097152, 4194304, 0)); }
使用web.xml
使用web.xml
-
處理multipart請(qǐng)求
在某個(gè)控制器方法參數(shù)上添加@RequestPart注解<form method="POST" th:object="${spitter}" enctype="multipart/form-data"> <label>Profile Picture</label>: <input type="file" name="profilePicture" accept="image/jpeg,image/png,image/gif" /> </form> //控制中有三種方式 //1. @RequestMapping(value="/register", method=POST) public String processRegistration( @RequestPart(value="profilePictures", required=false) byte[] fileBytes) throws IOException {} //2. @RequestMapping(value="/register", method=POST) public String processRegistration( @RequestPart(value="profilePictures", required=false) Part fileBytes) throws IOException {} //3. 使用MultipartFile 用在表單實(shí)體類(lèi)中互例。 用在參數(shù)中: @RequestMapping(method=RequestMethod.POST) public String processUpload(@RequestPart("file") MultipartFile file) {}
三、處理異常
異常必須要以某種方式轉(zhuǎn)換為響應(yīng)筝闹。
Spring提供了多種方式將異常轉(zhuǎn)換為響應(yīng):
- 特定的Spring異常將會(huì)自動(dòng)映射為指定的HTTP狀態(tài)碼媳叨;
- 異常上可以添加@ResponseStatus注解, 從而將其映射為某一個(gè)HTTP狀態(tài)碼关顷;
- 在方法上可以添加@ExceptionHandler注解糊秆, 使其用來(lái)處理異常。
- 處理異常的最簡(jiǎn)單方式就是將其映射到HTTP狀態(tài)碼上议双, 進(jìn)而放到響應(yīng)之中痘番。
- 將異常映射為HTTP狀態(tài)碼
Spring提供了一種機(jī)制, 能夠通過(guò)@ResponseStatus注解將異常映射為HTTP狀態(tài)碼。@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found") public class SpittleNotFoundException extends RuntimeException {}
- 編寫(xiě)異常處理的方法
// @ExceptionHandler注解標(biāo)注的方法能處理同一個(gè)控制器中所有處理器方法所拋出的異常汞舱。 @ExceptionHandler(DuplicateSpittleException.class) public String handleNotFound() { return "error/duplicate"; }