类型参考 https://www.cnblogs.com/101718qiong/p/9675076.html
1、定义映射关系
@Controller
@RequestMapping
path/method 路径与方法
params/headers 限定映射范围 (params='name' or params=‘!name’)
consumes/produces 限定请求与响应格式 (参考MediaType.class)
快捷方式 @RestController
@GetMapping/@PostMapping/@PutMapping/@DeleteMapping/@PatchMapping
Bindingresult
2、定义处理方法
@RequestBody/@ResponseBody/@ResponseStatus
@PathVariable(url = '.../{id} ' @PathVariable("id") Integer id)/@RequestParam/@RequestHeader
HttpEntity/ResponseEntity
@GetMapping(path = "/{id}",params="name",consumes = MediaType.APPLICATION_JSON_VALUE
,produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String getUserInfo(@PathVariable("id") Long id , @RequestParam String name){
return "id is "+id.toString()+"name is "+name;
}
3、定义类型转换
自己实现WebMvcConfigurer
SpringBoot 在 WebMvcConfiguation中实现了一个
自定义的 Converter、Fomatter
Formatter
package com.example.ribi.support;
import org.apache.commons.lang3.math.NumberUtils;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;
import org.springframework.format.Formatter;
import org.springframework.stereotype.Component;
import java.text.ParseException;
import java.util.Locale;
@Component
public class MoneyFormatter implements Formatter<Money> {
@Override
public Money parse(String s, Locale locale) throws ParseException {
System.out.println("entry formatter");
if(s.isEmpty()||!NumberUtils.isParsable(s)){
throw new ParseException(s,0);
}
//没做检查
return Money.of(CurrencyUnit.of("CNY"),NumberUtils.createBigDecimal(s));
}
@Override
public String print(Money money, Locale locale) {
System.out.println("money is : "+money.toString());
return null;
}
}
Controller
@GetMapping(path = "/coffee")
public String getUserInfo(Coffee coffee){
log.info(coffee.toString());
return coffee.toString();
}
测试
localhost:8080/user/coffee?money=12&name=moca
Coffee(name=moca, money=CNY 12.00)
4、定义校验
通过Validator对绑定结果进行校验
Hibernamte Validator
@Valid注解
BindingResult
package com.example.ribi.example;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.joda.money.Money;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.validation.constraints.NotEmpty;
@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Coffee {
@Id
@NotEmpty
private String name;
private Money money;
}
localhost:8080/user/coffee?money=12&name=
出错了
localhost:8080/user/coffee?money=12&name=moca
Coffee(name=moca, money=CNY 12.00)
5、Multipart上传
配置MultipartResolver
SpringBoot自动配置MultipartAutoConfiguration
支持类型 multipart/form-data
MultpartFile类型
@PostMapping(path = "/",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseBody
public List<Coffee> addCoffeeWithFormData(@RequestParam("file") MultipartFile file){
List<Coffee> list = new ArrayList<Coffee>();
if(!file.isEmpty()){
BufferedReader reader=null;
try {
reader = new BufferedReader( new InputStreamReader(file.getInputStream()));
String str;
while ((str=reader.readLine())!=null){
String[] arr = str.split("\t");
if(arr.length==2&&arr!=null){
list.add(Coffee.builder().name(arr[0].split(",")[1])
.money(Money.of(CurrencyUnit.of("CNY"),NumberUtils.createBigDecimal(arr[1].split(",")[1])))
.build());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
return list;
}
localhost:8080/user/ + coffee.text
coffee.text
coffee,moca money,12
--部分摘自极客时间玩转spring全家桶