Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 7f7c867

Browse files
Merge pull request helloworlde#14 from YinglishZhi/2020-api
2020 api
2 parents f26f308 + 133cf59 commit 7f7c867

File tree

19 files changed

+555
-113
lines changed

19 files changed

+555
-113
lines changed

‎README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
- [hikari](https://github.com/helloworlde/SpringBoot-DynamicDataSource/tree/hikari): 升级到SpringBoot 2.0版本 数据源使用 Hikar
1111
- **[多数据源分布式事务](https://github.com/helloworlde/spring-cloud-alibaba-component/tree/master/cloud-seata-multi-datasource): 使用 [Seata](https://github.com/seata/seata) 实现的多数据源事务**
1212

13+
1314
> 以上分支都是基于 dev 分支修改或扩充而来,基本涵盖了常用的多数据源动态切换的方式,基本的原理都一样,都是通过切面根据不同的条件在执行数据库操作前切换数据源
1415
1516
### 在使用的过程中基本踩遍了所有动态数据源切换的坑,将常见的一些坑和解决方法写在了 [Issues](https://github.com/helloworlde/SpringBoot-DynamicDataSource/blob/master/Issues.md) 里面
@@ -459,9 +460,9 @@ package cn.com.hellowood.dynamicdatasource.controller;
459460

460461
import cn.com.hellowood.dynamicdatasource.common.CommonResponse;
461462
import cn.com.hellowood.dynamicdatasource.common.ResponseUtil;
462-
import cn.com.hellowood.dynamicdatasource.modal.Product;
463+
import cn.com.hellowood.dynamicdatasource.model.Product;
463464
import cn.com.hellowood.dynamicdatasource.service.ProductService;
464-
import cn.com.hellowood.dynamicdatasource.utils.ServiceException;
465+
import cn.com.hellowood.dynamicdatasource.error.ServiceException;
465466
import org.springframework.beans.factory.annotation.Autowired;
466467
import org.springframework.web.bind.annotation.*;
467468

@@ -506,8 +507,8 @@ public class ProductController {
506507
package cn.com.hellowood.dynamicdatasource.service;
507508

508509
import cn.com.hellowood.dynamicdatasource.mapper.ProductDao;
509-
import cn.com.hellowood.dynamicdatasource.modal.Product;
510-
import cn.com.hellowood.dynamicdatasource.utils.ServiceException;
510+
import cn.com.hellowood.dynamicdatasource.model.Product;
511+
import cn.com.hellowood.dynamicdatasource.error.ServiceException;
511512
import org.springframework.beans.factory.annotation.Autowired;
512513
import org.springframework.dao.DataAccessException;
513514
import org.springframework.stereotype.Service;
@@ -568,7 +569,7 @@ public class ProductService {
568569
```java
569570
package cn.com.hellowood.dynamicdatasource.mapper;
570571

571-
import cn.com.hellowood.dynamicdatasource.modal.Product;
572+
import cn.com.hellowood.dynamicdatasource.model.Product;
572573
import org.apache.ibatis.annotations.Mapper;
573574
import org.apache.ibatis.annotations.Param;
574575

‎build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ dependencies {
3131
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
3232
compile('org.springframework.boot:spring-boot-starter-web')
3333
compile('org.springframework.boot:spring-boot-starter-aop')
34+
compile('com.alibaba:druid-spring-boot-starter:1.1.6')
35+
compile 'com.alibaba:fastjson:1.2.55'
3436
runtime('mysql:mysql-connector-java')
3537
testCompile('org.springframework.boot:spring-boot-starter-test')
3638
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package cn.com.hellowood.dynamicdatasource.apiutil.annotation;
2+
3+
import com.alibaba.fastjson.serializer.SerializerFeature;
4+
5+
import java.lang.annotation.*;
6+
7+
/**
8+
* 会在拦截器那里判断是否有这个注解,如果存在把结果包装成 {code:'',data:''} 的形式
9+
*
10+
* @author LDZ
11+
* @date 2020年03月02日 16:36
12+
*/
13+
@Target({ElementType.TYPE, ElementType.METHOD})
14+
@Retention(RetentionPolicy.RUNTIME)
15+
@Documented
16+
public @interface ApiResponseBody {
17+
/**
18+
* 序列化可选 fastjson
19+
*
20+
* @return
21+
* @see SerializerFeature
22+
*/
23+
SerializerFeature[] serializerFeature() default {};
24+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package cn.com.hellowood.dynamicdatasource.apiutil.config;
2+
3+
4+
import cn.com.hellowood.dynamicdatasource.apiutil.interceptor.ApiResponseBodyReturnValueHandler;
5+
import cn.com.hellowood.dynamicdatasource.configuration.CustomHandlerExceptionResolver;
6+
import com.alibaba.fastjson.support.config.FastJsonConfig;
7+
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
8+
import org.springframework.format.FormatterRegistry;
9+
import org.springframework.http.MediaType;
10+
import org.springframework.http.converter.HttpMessageConverter;
11+
import org.springframework.validation.MessageCodesResolver;
12+
import org.springframework.validation.Validator;
13+
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
14+
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
15+
import org.springframework.web.servlet.HandlerExceptionResolver;
16+
import org.springframework.web.servlet.config.annotation.*;
17+
18+
import java.util.Collections;
19+
import java.util.List;
20+
21+
22+
/**
23+
* spring boot web 通用配置
24+
*
25+
* @author LDZ
26+
* @date 2020年03月02日 17:12
27+
*/
28+
public abstract class BaseWebMvcConfig implements WebMvcConfigurer {
29+
30+
@Override
31+
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
32+
returnValueHandlers.add(new ApiResponseBodyReturnValueHandler());
33+
}
34+
35+
@Override
36+
public void addInterceptors(InterceptorRegistry registry) {
37+
}
38+
39+
@Override
40+
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
41+
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
42+
FastJsonConfig fastJsonConfig = new FastJsonConfig();
43+
44+
fastJsonConfig.setSerializerFeatures(
45+
// SerializerFeature.PrettyFormat
46+
);
47+
48+
fastConverter.setFastJsonConfig(fastJsonConfig);
49+
fastConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON_UTF8));
50+
converters.add(0, fastConverter);
51+
52+
}
53+
54+
@Override
55+
public void configurePathMatch(PathMatchConfigurer configurer) {
56+
57+
}
58+
59+
@Override
60+
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
61+
62+
}
63+
64+
@Override
65+
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
66+
67+
}
68+
69+
@Override
70+
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
71+
72+
}
73+
74+
@Override
75+
public void addFormatters(FormatterRegistry registry) {
76+
77+
}
78+
79+
@Override
80+
public void addResourceHandlers(ResourceHandlerRegistry registry) {
81+
82+
}
83+
84+
@Override
85+
public void addCorsMappings(CorsRegistry registry) {
86+
87+
}
88+
89+
@Override
90+
public void addViewControllers(ViewControllerRegistry registry) {
91+
92+
}
93+
94+
@Override
95+
public void configureViewResolvers(ViewResolverRegistry registry) {
96+
97+
}
98+
99+
@Override
100+
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
101+
102+
}
103+
104+
@Override
105+
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
106+
107+
}
108+
109+
@Override
110+
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
111+
exceptionResolvers.add(new CustomHandlerExceptionResolver());
112+
}
113+
114+
@Override
115+
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
116+
117+
}
118+
119+
@Override
120+
public Validator getValidator() {
121+
return null;
122+
}
123+
124+
@Override
125+
public MessageCodesResolver getMessageCodesResolver() {
126+
return null;
127+
}
128+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package cn.com.hellowood.dynamicdatasource.apiutil.exception;
2+
3+
import cn.com.hellowood.dynamicdatasource.apiutil.model.BaseResponse;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import org.springframework.validation.BindException;
7+
import org.springframework.web.bind.MissingServletRequestParameterException;
8+
import org.springframework.web.bind.annotation.ControllerAdvice;
9+
import org.springframework.web.bind.annotation.ExceptionHandler;
10+
import org.springframework.web.bind.annotation.ResponseBody;
11+
12+
import javax.servlet.http.HttpServletRequest;
13+
import javax.servlet.http.HttpServletResponse;
14+
import java.util.Optional;
15+
import java.util.stream.Collectors;
16+
17+
import static cn.com.hellowood.dynamicdatasource.apiutil.exception.enums.CustomExceptionEnum.PARAM_ERROR;
18+
19+
/**
20+
* 错误处理句柄
21+
*
22+
* @author LDZ
23+
* @date 2020年03月02日 17:19
24+
*/
25+
26+
@ControllerAdvice
27+
public class BaseExceptionHandler {
28+
29+
private static final Logger log = LoggerFactory.getLogger(BaseExceptionHandler.class);
30+
31+
/**
32+
* @param request 请求
33+
* @param response 返回
34+
* @param handler 句柄
35+
* @param ex 错误
36+
* @return 统一封装返回值
37+
*/
38+
@ResponseBody
39+
@ExceptionHandler(MissingServletRequestParameterException.class)
40+
public BaseResponse argumentMissingError(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
41+
return PARAM_ERROR.handlerBaseResponse("参数错误");
42+
}
43+
44+
@ResponseBody
45+
@ExceptionHandler(BindException.class)
46+
public BaseResponse bindError(HttpServletRequest request, HttpServletResponse response, Object handler, BindException ex) {
47+
String errMessage = ex.getFieldErrors().stream().map(fieldError -> fieldError.getField() + ":" + fieldError.getDefaultMessage()).collect(Collectors.joining(","));
48+
log.warn("server param error ", ex);
49+
return PARAM_ERROR.handlerBaseResponse(errMessage);
50+
51+
}
52+
53+
54+
/**
55+
* 抓取所有的错误
56+
*
57+
* @param request
58+
* @param response
59+
* @param handler
60+
* @param ex
61+
* @return
62+
*/
63+
@ResponseBody
64+
@ExceptionHandler(Exception.class)
65+
public BaseResponse defaultErrorHandle(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
66+
log.error("server error ", ex);
67+
return PARAM_ERROR.handlerBaseResponse("服务器繁忙");
68+
}
69+
70+
71+
@ResponseBody
72+
@ExceptionHandler(CustomServiceException.class)
73+
public BaseResponse customExceptionHandle(HttpServletRequest request, HttpServletResponse response, Object handler, CustomServiceException customServiceException) {
74+
75+
log.debug("business err {} ", customServiceException.getErrorDescription());
76+
return customServiceException.getCustomExceptionEnum().handlerBaseResponse(
77+
Optional.ofNullable(customServiceException.getErrorDescription()).orElse("服务器繁忙"),
78+
Optional.ofNullable(customServiceException.getData()).orElse(null));
79+
80+
81+
}
82+
83+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package cn.com.hellowood.dynamicdatasource.apiutil.exception;
2+
3+
/**
4+
* @author XiaoLei
5+
* @date 2018年4月17日 15:19
6+
* @description
7+
*/
8+
9+
import cn.com.hellowood.dynamicdatasource.apiutil.exception.enums.CustomExceptionEnum;
10+
11+
/**
12+
* 自定义异常
13+
*
14+
* @author LDZ
15+
* @date 2020年03月02日 17:22
16+
*/
17+
public class CustomServiceException extends RuntimeException {
18+
19+
/**
20+
* 自定义错误
21+
*/
22+
private CustomExceptionEnum customExceptionEnum;
23+
24+
/**
25+
* 错误的描述
26+
*/
27+
private String errorDescription;
28+
29+
/**
30+
* 需要返回的数据
31+
*/
32+
private Object data;
33+
34+
35+
public CustomServiceException(CustomExceptionEnum customExceptionEnum, String desc) {
36+
super(desc);
37+
this.customExceptionEnum = customExceptionEnum;
38+
this.errorDescription = desc;
39+
}
40+
41+
public CustomServiceException(CustomExceptionEnum customExceptionEnum, String desc, Object data) {
42+
super(desc);
43+
this.customExceptionEnum = customExceptionEnum;
44+
this.errorDescription = desc;
45+
this.data = data;
46+
}
47+
48+
public CustomExceptionEnum getCustomExceptionEnum() {
49+
return customExceptionEnum;
50+
}
51+
52+
public void setCustomExceptionEnum(CustomExceptionEnum customExceptionEnum) {
53+
this.customExceptionEnum = customExceptionEnum;
54+
}
55+
56+
public String getErrorDescription() {
57+
return errorDescription;
58+
}
59+
60+
public void setErrorDescription(String errorDescription) {
61+
this.errorDescription = errorDescription;
62+
}
63+
64+
public Object getData() {
65+
return data;
66+
}
67+
68+
public void setData(Object data) {
69+
this.data = data;
70+
}
71+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /