配置类
DefaultFastjsonConfig
: fastjson数据处理配置:日期处理
package com.ysu.shop.config;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
@Configuration("defaultFastjsonConfig")
@ConditionalOnClass(com.alibaba.fastjson.JSON.class)
@ConditionalOnMissingBean(FastJsonHttpMessageConverter.class)
@ConditionalOnWebApplication
public class DefaultFastjsonConfig {
@Bean
public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
converter.setFastJsonConfig(fastjsonConfig());
converter.setSupportedMediaTypes(getSupportedMediaType());
return converter;
}
public FastJsonConfig fastjsonConfig() {
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.PrettyFormat,
SerializerFeature.WriteEnumUsingToString
);
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
fastJsonConfig.setCharset(Charset.forName("utf-8"));
SerializeConfig serializeConfig = SerializeConfig.globalInstance;
serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
serializeConfig.put(Long.class, ToStringSerializer.instance);
serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
fastJsonConfig.setSerializeConfig(serializeConfig);
return fastJsonConfig;
}
public List<MediaType> getSupportedMediaType() {
ArrayList<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
return mediaTypes;
}
}
SwaggerConfig
:swagger2文档配置
package com.ysu.shop.config;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build()
.securitySchemes(security())
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("睿乐购商城").description("接口文档").termsOfServiceUrl("http://www.localhost:8082").version("1.0.0").build();
}
private List<ApiKey> security() {
ArrayList<ApiKey> apiKeys = new ArrayList<>();
apiKeys.add(new ApiKey("token", "token", "header"));
return apiKeys;
}
}
获取用户的登录信息
package com.ysu.shop.annotation;
import java.lang.annotation.*;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TokenToUser {
String value() default "oldUser";
}
package com.ysu.shop.handler;
import com.ysu.shop.annotation.TokenToUser;
import com.ysu.shop.pojo.User;
import com.ysu.shop.service.UserService;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component
public class TokenToUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Resource
private UserService userService;
public TokenToUserMethodArgumentResolver() {
}
public boolean supportsParameter(MethodParameter parameter) {
if (parameter.hasParameterAnnotation(TokenToUser.class)) {
return true;
}
return false;
}
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
if (parameter.getParameterAnnotation(TokenToUser.class) instanceof TokenToUser) {
User oldUser = null;
String token = webRequest.getHeader("token");
if (null != token && !"".equals(token) && token.length() == 32) {
oldUser = userService.getUserByToken(token);
}
return oldUser;
}
return null;
}
public static byte[] getRequestPostBytes(HttpServletRequest request)
throws IOException {
int contentLength = request.getContentLength();
if (contentLength < 0) {
return null;
}
byte buffer[] = new byte[contentLength];
for (int i = 0; i < contentLength; ) {
int readlen = request.getInputStream().read(buffer, i,
contentLength - i);
if (readlen == -1) {
break;
}
i += readlen;
}
return buffer;
}
}
package com.ysu.shop.config;
import com.ysu.shop.handler.TokenToUserMethodArgumentResolver;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
import java.util.List;
@Configuration
public class SpringBootWebMvcConfigurer implements WebMvcConfigurer {
@Resource
private TokenToUserMethodArgumentResolver tokenUserMethodArgumentResolver;
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(tokenUserMethodArgumentResolver);
}
}
全局异常处理
package com.ysu.shop.exception;
public class MyException extends RuntimeException {
private static final long serialVersionUID = 6445638039342655172L;
private int code;
private String msg;
public MyException(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
package com.ysu.shop.exception;
public class UserNoLoginException extends MyException{
private static final long serialVersionUID = 5276752412710843243L;
private static final String MSG = "用户未登录,无法操作";
private String msg;
private static final int code = 402;
public UserNoLoginException(){
super(code,MSG);
this.msg = MSG;
}
public UserNoLoginException(String msg) {
super(code,msg);
this.msg = msg;
}
@Override
public String getMsg() {
return msg;
}
@Override
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public int getCode() {
return UserNoLoginException.code;
}
}
package com.ysu.shop.exception;
public class NotAuthorityException extends MyException{
private static final long serialVersionUID = 174218172435946873L;
private static final String MSG = "不是管理员,没有该权限操作";
private String msg;
private static final int code = 412;
public NotAuthorityException(){
super(code,MSG);
this.msg = MSG;
}
public NotAuthorityException(String msg) {
super(code, msg);
this.msg = msg;
}
@Override
public String getMsg() {
return msg;
}
@Override
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public int getCode() {
return NotAuthorityException.code;
}
}
package com.ysu.shop.exception;
public class ParamValidException extends MyException{
private static final long serialVersionUID = 1L;
private static final String MSG = "参数异常!";
private String msg;
private static final int code = 406;
public ParamValidException(){
super(code,MSG);
this.msg = MSG;
}
public ParamValidException(String msg) {
super(code, msg);
this.msg = msg;
}
@Override
public String getMsg() {
return msg;
}
@Override
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public int getCode() {
return ParamValidException.code;
}
}
package com.ysu.shop.handler;
import com.ysu.shop.exception.MyException;
import com.ysu.shop.util.Result;
import com.ysu.shop.util.ResultGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
@RestControllerAdvice
@SuppressWarnings("all")
public class GlobalExceptionHandle {
private static Logger log = LoggerFactory.getLogger(MyException.class);
private static final int NOT_FOUND = 404;
@ExceptionHandler(value = Exception.class)
public Result handleException(Exception e, HttpServletRequest request) {
if (e instanceof MyException) {
log.error("msg:{}, url:{}", ((MyException) e).getMsg(), request.getRequestURL());
return ResultGenerator.getErrorResult(((MyException) e).getCode(), ((MyException) e).getMsg());
}
e.printStackTrace();
log.error("msg:{}, url:{}", e.getMessage(), request.getRequestURL());
return ResultGenerator.getErrorResult(NOT_FOUND, e.getMessage());
}
}
数据封装工具类
package com.ysu.shop.util;
import java.io.Serializable;
public class Result<T> implements Serializable {
private static final long serialVersionUID = 1L;
private int status;
private String msg;
private T data;
public Result() {
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return "Result{" +
"status=" + status +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
package com.ysu.shop.util;
import org.springframework.util.StringUtils;
@SuppressWarnings("all")
public class ResultGenerator {
private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";
private static final String DEFAULT_FAIL_MESSAGE = "FAIL";
public static Result getSuccessResult() {
Result result = new Result();
result.setStatus(Constants.RESULT_CODE_SUCCESS);
result.setMsg(DEFAULT_SUCCESS_MESSAGE);
return result;
}
public static Result getSuccessResult(String message) {
Result result = new Result();
result.setStatus(Constants.RESULT_CODE_SUCCESS);
result.setMsg(message);
return result;
}
public static Result getSuccessResult(Object data) {
Result result = new Result();
result.setStatus(Constants.RESULT_CODE_SUCCESS);
result.setMsg(DEFAULT_SUCCESS_MESSAGE);
result.setData(data);
return result;
}
public static Result getFailResult(String message) {
Result result = new Result();
result.setStatus(Constants.RESULT_CODE_SERVER_ERROR);
if (StringUtils.isEmpty(message)) {
result.setMsg(DEFAULT_FAIL_MESSAGE);
} else {
result.setMsg(message);
}
return result;
}
public static Result getNullResult(String message) {
Result result = new Result();
result.setStatus(Constants.RESULT_CODE_BAD_REQUEST);
result.setMsg(message);
return result;
}
public static Result getErrorResult(int code, String message) {
Result result = new Result();
result.setStatus(code);
result.setMsg(message);
return result;
}
public static Result getErrorResult(String msg){
Result result = new Result();
result.setStatus(Constants.RESULT_CODE_ERROR);
result.setMsg(msg);
return result;
}
public static Result getErrorByParams(String msg){
Result result = new Result();
result.setStatus(Constants.RESULT_CODE_PARAM_ERROR);
result.setMsg(msg);
return result;
}
}
分页工具类
package com.ysu.shop.util;
import java.io.Serializable;
import java.util.List;
public class PageResult implements Serializable {
private static final long serialVersionUID = -619801323991675434L;
private int totalCount;
private int pageSize;
private int totalPage;
private int currPage;
private List<?> list;
public PageResult(List<?> list, int totalCount, int pageSize, int currPage) {
this.list = list;
this.totalCount = totalCount;
this.pageSize = pageSize;
this.currPage = currPage;
this.totalPage = (int) Math.ceil((double) totalCount / pageSize);
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getCurrPage() {
return currPage;
}
public void setCurrPage(int currPage) {
this.currPage = currPage;
}
public List<?> getList() {
return list;
}
public void setList(List<?> list) {
this.list = list;
}
@Override
public String toString() {
return "PageResult{" +
"totalCount=" + totalCount +
", pageSize=" + pageSize +
", totalPage=" + totalPage +
", currPage=" + currPage +
", list=" + list +
'}';
}
}
package com.ysu.shop.util;
import java.util.LinkedHashMap;
import java.util.Map;
public class PageUtil extends LinkedHashMap<String, Object> {
private static final long serialVersionUID = 6266971646743089177L;
private int page;
private int limit;
public PageUtil(Map<String, Object> params) {
this.putAll(params);
this.page = Integer.parseInt(params.get("page").toString());
this.limit = Integer.parseInt(params.get("limit").toString());
this.put("start", (page - 1) * limit);
this.put("page", page);
this.put("limit", limit);
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
@Override
public String toString() {
return "PageUtil{" +
"page=" + page +
", limit=" + limit +
'}';
}
}