1.maven部分jar包下載不到捐韩,要看看是不是springboot版本問(wèn)題退唠,可以在pom.xml文件更改版本試試。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
2.pom.xml中java版本為1.7時(shí)荤胁,需要添加配置編譯插件瞧预。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.7</java.version>
</properties>
添加編譯插件
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
3.谷歌json字符串序列化和反序列化工具類
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
用法如下
對(duì)象序列化為json字符串
...
String data = new Gson().toJson(appgpsBean);
...
json字符串反序列化為對(duì)象
...
List<HPMCameraBean> tempList = new Gson().fromJson(data,new TypeToken<List<HPMCameraBean>>(){}.getType());
...
4.解決跨域訪問(wèn)攔截器
/**
* 攔截器
* Created by lin on 2017/8/21.
*/
public class AccessInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//解決跨域請(qǐng)求
if(httpServletResponse!=null){
httpServletResponse.addHeader("Access-Control-Allow-Origin", "*");
httpServletResponse.addHeader("Access-Control-Allow-Methods", "get, post, put, delete, options");
httpServletResponse.addHeader("Access-Control-Allow-Headers", "origin, content-type, accept");
httpServletResponse.addHeader("Access-Control-Allow-Credentials", "true");
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
5.WebMvcConfigurerAdapter類應(yīng)用(重要)
WebMvcConfigurerAdapter配置類其實(shí)是Spring內(nèi)部的一種配置方式,采用JavaBean的形式來(lái)代替?zhèn)鹘y(tǒng)的xml配置文件形式進(jìn)行針對(duì)框架個(gè)性化定制仅政。
在配置類上添加了注解@Configuration垢油,標(biāo)明了該類是一個(gè)配置類并且會(huì)將該類作為一個(gè)SpringBean添加到IOC容器內(nèi)。
@Configuration
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Value("${tokenEnabled}")
Boolean tokenEnabled;
@Value("${uploadFilePath}")
String uploadFilePath;
@Bean
public TokenInterceptor getTokenInterceptor(){
return new TokenInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AccessInterceptor()).addPathPatterns("/**");
if(tokenEnabled)
registry.addInterceptor(getTokenInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/","/user/login","/images/**","/expand/getLatestVersion","/test/**","/APBS/error");
super.addInterceptors(registry);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//addResourceHandler是指你想在url請(qǐng)求的路徑
//addResourceLocations是圖片存放的真實(shí)路徑
registry.addResourceHandler("/images/**").addResourceLocations("file:"+uploadFilePath);
super.addResourceHandlers(registry);
}
}
6.全局異常處理
業(yè)務(wù)異常類
/**
* Created by lin on 2017/10/20.
* 實(shí)際業(yè)務(wù)異常
*/
public class BusinessException extends RuntimeException{
private int code=-1;
public BusinessException(String message, int code) {
super(message);
this.code = code;
}
public BusinessException(String message) {
super(message);
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
異常處理器
/**
* 異常處理器圆丹,捕獲所有異常滩愁,并按照統(tǒng)一格式返回
* Created by lin on 2017/8/21.
*/
@ControllerAdvice
public class ExceptionHandler {
Logger logger = LoggerFactory.getLogger(ExceptionHandler.class);
@org.springframework.web.bind.annotation.ExceptionHandler(Exception.class)
@ResponseBody
public Result handleException(HttpServletRequest request, Exception e) {
logger.error("系統(tǒng)異常: RequestURI=" +request.getRequestURL()) ;
logger.error("系統(tǒng)異常:" +e.toString());
logger.error("系統(tǒng)異常:" +e.getMessage(),e);
e.printStackTrace();
if (e instanceof HttpRequestMethodNotSupportedException) {
return ResultUtil.error(ErrorCode.REQUEST_METHOD_ERROR.getValue(), "HttpRequestMethodNotSupportedException:請(qǐng)求方式(Get/Post)錯(cuò)誤");
}
if (e instanceof MissingServletRequestParameterException) {
return ResultUtil.error(ErrorCode.MISSING_PARAMETERS.getValue(),"MissingServletRequestParameterException: 缺少參數(shù)");
}
if (e instanceof MethodArgumentTypeMismatchException) {
return ResultUtil.error(ErrorCode.INVALID_PARAMETERS.getValue(),"MethodArgumentTypeMismatchException:參數(shù)類型錯(cuò)誤");
}
if (e instanceof BusinessException) {
if(e.getMessage() == "token missing")
{
return ResultUtil.error(ErrorCode.TOKEN_MISSING.getValue(),e.getMessage());
}
else
if(e.getMessage() == "token incorrect or expired")
{
return ResultUtil.error(ErrorCode.TOKEN_OVERTIME.getValue(),e.getMessage());
}
return ResultUtil.error(e.getMessage());
}
return ResultUtil.error(ErrorCode.FAILED.getValue(),"系統(tǒng)異常" );
}
}
拋出業(yè)務(wù)異常
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
String token="" ;
try {
token = httpServletRequest.getParameter("token");
}catch (Exception e){
throw new BusinessException("token missing");
}
if (tokenService.verifyToken(token)) {
logger.warn(">>>>>>>>>>>>>>>>>token:" + token + "\t 在攔截器驗(yàn)證成功>>>>>>>>>>>>>>>>>>");
return true;// 只有返回true才會(huì)繼續(xù)向下執(zhí)行,返回false取消當(dāng)前請(qǐng)求 3c3d2eacb5d0435c9918f4c1eac50f0f
} else {
String url = httpServletRequest.getRequestURI();
logger.warn(">>>>>>>>>>>>>>>>>token:" + token + "\t 在攔截器驗(yàn)證失敗>>>>>>>>>>>>>>>>>>");
logger.warn(">>>>>>>>>>>>>>>>>驗(yàn)證失敗url:" + url);
throw new BusinessException("token incorrect or expired");
}
}
7.統(tǒng)一接口返回格式
分頁(yè)數(shù)據(jù)格式類
/**
* Created by lin on 2017/8/15.
*/
public class PageData <M> implements Serializable {
private static final long serialVersionUID = 1L;
private Integer currentPage;// 當(dāng)前頁(yè)數(shù)
private Integer pageSize;// 每頁(yè)的大小
private Long total;// 數(shù)據(jù)總條數(shù)
private List<M> rows;// 當(dāng)前頁(yè)的數(shù)據(jù)
public PageData(List<M> rows, Long total, Integer pageSize,
Integer currentPage) {
this.total = total;
this.rows = rows;
this.pageSize = pageSize;
this.currentPage = currentPage;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
public List<M> getRows() {
return rows;
}
public void setRows(List<M> rows) {
this.rows = rows;
}
}
統(tǒng)一結(jié)果數(shù)據(jù)格式類
/**
* Created by lin on 2017/8/15.
*/
public class Result implements Serializable {
Integer code;
String msg;
Object data;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
統(tǒng)一結(jié)果數(shù)據(jù)格式工具類
/**
* Created by lin on 2017/8/15.
*/
public class ResultUtil {
public static Result success(){
Result result=new Result();
result.setCode(0);
result.setMsg("success");
return result;
}
public static Result success(Object o){
Result result=new Result();
result.setCode(0);
result.setMsg("success");
result.setData(o);
return result;
}
public static Result error(){
Result result=new Result();
result.setCode(-1);
result.setMsg("error");
return result;
}
public static Result error(String msg){
Result result=new Result();
result.setCode(-1);
result.setMsg(msg);
return result;
}
public static Result error(Integer code, String msg){
Result result=new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
}
用法
Result result;
long size = cameraList.size();
PageData<HPMCameraBean> resultata = new PageData<HPMCameraBean>(cameraList, size, pagesize, page);
result = ResultUtil.success(resultata);