diff --git a/.gitignore b/.gitignore index c0d329d..2d85157 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,9 @@ SpringBootCodeBase.iml /SpringBoot-LTS/target/ /logs/ /springBoot-ShardingJDBC/target/ +/SpringBoot-mybatis-plus/target/ +/SpringBoot-OSS/target/ +/SpringBoot-rocketMQ-producer/ +/SpringBoot-rocketMQ-producer/mq-producer.iml +/SpringBoot-Security/target/ +/SpringBoot-rocketMQ-consumer/target/ \ No newline at end of file diff --git a/SpringBoot-AOP/pom.xml b/SpringBoot-AOP/pom.xml index c30fbf8..6115baa 100644 --- a/SpringBoot-AOP/pom.xml +++ b/SpringBoot-AOP/pom.xml @@ -43,6 +43,14 @@ fastjson 1.2.41 + + + org.hibernate.validator + hibernate-validator + 6.1.2.Final + + + diff --git a/SpringBoot-AOP/src/main/java/com/fancv/ExceptionHandler/GlobalExceptionHandler.java b/SpringBoot-AOP/src/main/java/com/fancv/ExceptionHandler/GlobalExceptionHandler.java index 6e91b28..af1f257 100644 --- a/SpringBoot-AOP/src/main/java/com/fancv/ExceptionHandler/GlobalExceptionHandler.java +++ b/SpringBoot-AOP/src/main/java/com/fancv/ExceptionHandler/GlobalExceptionHandler.java @@ -3,16 +3,22 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; +import javax.validation.ConstraintViolationException; +import javax.validation.ValidationException; @ControllerAdvice public class GlobalExceptionHandler { private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); + private static String DUPLICATE_KEY_CODE = "1001"; + private static String PARAM_FAIL_CODE = "1002"; + private static String VALIDATION_CODE = "1003"; /** * 处理自定义的业务异常 * @param req @@ -52,5 +58,36 @@ public ResultBody exceptionHandler(HttpServletRequest req, Exception e){ logger.error("未知异常!原因是:",e); return ResultBody.error(CommonEnum.INTERNAL_SERVER_ERROR); } + + + /** + * 方法参数校验 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseBody + public ResultBody handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + logger.error(e.getMessage(), e); + return ResultBody.error(PARAM_FAIL_CODE, e.getBindingResult().getFieldError().getDefaultMessage()); + } + + /** + * ValidationException + */ + @ExceptionHandler(ValidationException.class) + @ResponseBody + public ResultBody handleValidationException(ValidationException e) { + logger.error(e.getMessage(), e); + return ResultBody.error(VALIDATION_CODE, e.getCause().getMessage()); + } + + /** + * ConstraintViolationException + */ + @ExceptionHandler(ConstraintViolationException.class) + @ResponseBody + public ResultBody handleConstraintViolationException(ConstraintViolationException e) { + logger.error(e.getMessage(), e); + return ResultBody.error(PARAM_FAIL_CODE, e.getMessage()); + } } diff --git a/SpringBoot-AOP/src/main/java/com/fancv/ExceptionHandler/ResultBody.java b/SpringBoot-AOP/src/main/java/com/fancv/ExceptionHandler/ResultBody.java index 874ea20..d220288 100644 --- a/SpringBoot-AOP/src/main/java/com/fancv/ExceptionHandler/ResultBody.java +++ b/SpringBoot-AOP/src/main/java/com/fancv/ExceptionHandler/ResultBody.java @@ -2,7 +2,9 @@ import com.alibaba.fastjson.JSONObject; +import lombok.Data; +@Data public class ResultBody { /** * 响应代码 diff --git a/SpringBoot-AOP/src/main/java/com/fancv/controller/UserListController.java b/SpringBoot-AOP/src/main/java/com/fancv/controller/UserListController.java index 27e142d..9c2de53 100644 --- a/SpringBoot-AOP/src/main/java/com/fancv/controller/UserListController.java +++ b/SpringBoot-AOP/src/main/java/com/fancv/controller/UserListController.java @@ -1,18 +1,22 @@ package com.fancv.controller; +import com.alibaba.fastjson.JSON; +import com.fancv.login.BaseUserDTO; import com.fancv.permission.PermissionAnnotation; import io.swagger.annotations.Api; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("user/") @Api(tags = "1.user") +@Slf4j public class UserListController { @@ -30,4 +34,11 @@ public String userLogin(@RequestParam(defaultValue = "001") String userId) { return "登录成功!"; } + @PostMapping("login_1") + public String login(@RequestBody @Validated BaseUserDTO baseUserDTO) { + + log.info(JSON.toJSONString(baseUserDTO)); + return "OK"; + } + } diff --git a/SpringBoot-AOP/src/main/java/com/fancv/login/BaseUserDTO.java b/SpringBoot-AOP/src/main/java/com/fancv/login/BaseUserDTO.java index 5f8b097..eca5a05 100644 --- a/SpringBoot-AOP/src/main/java/com/fancv/login/BaseUserDTO.java +++ b/SpringBoot-AOP/src/main/java/com/fancv/login/BaseUserDTO.java @@ -2,11 +2,15 @@ import lombok.Data; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.io.Serializable; import java.util.List; @Data -public class BaseUserDTO { +public class BaseUserDTO implements Serializable { + @NotNull(message = "用户姓名不能为空") String userNmae; String userPermission; @@ -15,6 +19,9 @@ public class BaseUserDTO { List permissions; + @Valid + EnterDTO enterDTO; + public void addPeemission(String p) { this.permissions.add(p); } diff --git a/SpringBoot-AOP/src/main/java/com/fancv/login/EnterDTO.java b/SpringBoot-AOP/src/main/java/com/fancv/login/EnterDTO.java new file mode 100644 index 0000000..bb3ca76 --- /dev/null +++ b/SpringBoot-AOP/src/main/java/com/fancv/login/EnterDTO.java @@ -0,0 +1,17 @@ +package com.fancv.login; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + + +@ApiModel("enterDTO") +@Data +public class EnterDTO { + + @NotNull(message = "not empty") + @Min(1) + private Long version; +} diff --git a/SpringBoot-AOP/target/classes/com/fancv/ExceptionHandler/GlobalExceptionHandler.class b/SpringBoot-AOP/target/classes/com/fancv/ExceptionHandler/GlobalExceptionHandler.class index ba749be..783254f 100644 Binary files a/SpringBoot-AOP/target/classes/com/fancv/ExceptionHandler/GlobalExceptionHandler.class and b/SpringBoot-AOP/target/classes/com/fancv/ExceptionHandler/GlobalExceptionHandler.class differ diff --git a/SpringBoot-AOP/target/classes/com/fancv/controller/UserListController.class b/SpringBoot-AOP/target/classes/com/fancv/controller/UserListController.class index 0884489..e1454a7 100644 Binary files a/SpringBoot-AOP/target/classes/com/fancv/controller/UserListController.class and b/SpringBoot-AOP/target/classes/com/fancv/controller/UserListController.class differ diff --git a/SpringBoot-AOP/target/classes/com/fancv/login/BaseUserDTO.class b/SpringBoot-AOP/target/classes/com/fancv/login/BaseUserDTO.class index 24cf52f..13a2154 100644 Binary files a/SpringBoot-AOP/target/classes/com/fancv/login/BaseUserDTO.class and b/SpringBoot-AOP/target/classes/com/fancv/login/BaseUserDTO.class differ diff --git a/SpringBoot-MyBatis-Advances/Readme.md b/SpringBoot-MyBatis-Advances/Readme.md index 27dd9b3..5a4d729 100644 --- a/SpringBoot-MyBatis-Advances/Readme.md +++ b/SpringBoot-MyBatis-Advances/Readme.md @@ -1,3 +1,5 @@ # springboot mybatis advance demo ## DataSource drui ## Reading and writing separation +## spring cache redis +spring cache redis 类型的实现,满足常用的配置、数据字典、类目等常见缓存场景的使用。 diff --git a/SpringBoot-OSS/src/main/resources/application.properties b/SpringBoot-OSS/src/main/resources/application.properties index 11ca3a1..47dc664 100644 --- a/SpringBoot-OSS/src/main/resources/application.properties +++ b/SpringBoot-OSS/src/main/resources/application.properties @@ -1,35 +1,25 @@ spring.application.name=spring-boot-oss - spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest - - -# ߿ confirm ȷϻ +# \u00B7\u00A2\u00CB\u00CD\u00D5\u00DF\u00BF\u00AA\u00C6\u00F4 confirm \u00C8\u00B7\u00C8\u00CF\u00BB\u00FA\u00D6\u00C6 spring.rabbitmq.publisher-confirm-type=simple -# ߿ return ȷϻ +# \u00B7\u00A2\u00CB\u00CD\u00D5\u00DF\u00BF\u00AA\u00C6\u00F4 return \u00C8\u00B7\u00C8\u00CF\u00BB\u00FA\u00D6\u00C6 spring.rabbitmq.publisher-returns=true #################################################### -# Ѷֶ ack +# \u00C9\u00E8\u00D6\u00C3\u00CF\u00FB\u00B7\u00D1\u00B6\u00CB\u00CA\u00D6\u00B6\u00AF ack spring.rabbitmq.listener.simple.acknowledge-mode=manual -# Ƿ֧ +# \u00CA\u00C7\u00B7\u00F1\u00D6\u00A7\u00B3\u00D6\u00D6\u00D8\u00CA\u00D4 spring.rabbitmq.listener.simple.retry.enabled=true - - server.port=9010 - - rayOssKey=LTAI5t5sF7sXqD8by7p3RCRB rayOssSecret= rayOssEndpoint= rayBucketName= - spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=2048MB spring.servlet.multipart.maxRequestSize=2048MB - - dam.oss.accessKeyId= dam.oss.accessKeySecret= dam.oss.bucketName= diff --git a/SpringBoot-PgSQL/pom.xml b/SpringBoot-PgSQL/pom.xml new file mode 100644 index 0000000..1ec9c34 --- /dev/null +++ b/SpringBoot-PgSQL/pom.xml @@ -0,0 +1,97 @@ + + + + + SpringBootCodeBase + com.fancv + 1.0-SNAPSHOT + + 4.0.0 + + SpringBoot-PgSQL + + SpringBoot-PgSQL + + http://www.fancv.com + + + UTF-8 + 11 + 11 + + + + + junit + junit + 4.11 + test + + + org.springframework.boot + spring-boot-starter-web + + + org.postgresql + postgresql + + + com.alibaba + druid + 1.0.27 + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.1.1 + + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + diff --git a/SpringBoot-PgSQL/src/main/java/com/fancv/App.java b/SpringBoot-PgSQL/src/main/java/com/fancv/App.java new file mode 100644 index 0000000..7b406eb --- /dev/null +++ b/SpringBoot-PgSQL/src/main/java/com/fancv/App.java @@ -0,0 +1,17 @@ +package com.fancv; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Hello world! + * + */ +@SpringBootApplication +public class App +{ + public static void main( String[] args ) + { + SpringApplication.run(App.class,args); + } +} diff --git a/SpringBoot-PgSQL/src/main/java/com/fancv/config/DataConfig.java b/SpringBoot-PgSQL/src/main/java/com/fancv/config/DataConfig.java new file mode 100644 index 0000000..f3f9942 --- /dev/null +++ b/SpringBoot-PgSQL/src/main/java/com/fancv/config/DataConfig.java @@ -0,0 +1,43 @@ +package com.fancv.config; + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; + +import javax.sql.DataSource; + +@Configuration +public class DataConfig { + @Value("${spring.datasource.username}") + private String user; + @Value("${spring.datasource.password}") + private String pass; + @Value("${spring.datasource.url}") + private String url; + @Value("${spring.datasource.driver-class-name}") + private String driverClassName; + + @Bean(name = "data_pgsql") + public DataSource dataSource() { + return getDruidDataSource(user,pass,url,driverClassName); + } + + private DruidDataSource getDruidDataSource(String name, String password, String url, String driver){ + DruidDataSource druidDataSource = new DruidDataSource(); + druidDataSource.setDriverClassName(driver); + druidDataSource.setUrl(url); + druidDataSource.setUsername(name); + druidDataSource.setPassword(password); + return druidDataSource; + } + + @Bean(name = "jdbc_pgsql") + public JdbcTemplate getJdbcTemplate(@Qualifier("data_pgsql") DataSource dataSource) { + return new JdbcTemplate(dataSource); + } + +} + diff --git a/SpringBoot-PgSQL/src/main/java/com/fancv/controller/TestController.java b/SpringBoot-PgSQL/src/main/java/com/fancv/controller/TestController.java new file mode 100644 index 0000000..2fcf510 --- /dev/null +++ b/SpringBoot-PgSQL/src/main/java/com/fancv/controller/TestController.java @@ -0,0 +1,30 @@ +package com.fancv.controller; + +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDate; + +@RestController +@Api(tags = "1") +public class TestController { + + @Autowired + @Qualifier("jdbc_pgsql") + private JdbcTemplate jdbcTemplate; + + @GetMapping(value = "/getUser") + public Object get() { + + LocalDate date = LocalDate.now(); + + System.out.println(date.toString()); + String sql = "select * from public.user"; + return jdbcTemplate.queryForList(sql); + } +} + diff --git a/SpringBoot-PgSQL/src/main/resources/application.yaml b/SpringBoot-PgSQL/src/main/resources/application.yaml new file mode 100644 index 0000000..f56948b --- /dev/null +++ b/SpringBoot-PgSQL/src/main/resources/application.yaml @@ -0,0 +1,28 @@ +spring: + datasource: + username: 'postgres' + password: 'abc123' + url: jdbc:postgresql://127.0.0.1:5432/first + driver-class-name: org.postgresql.Driver + type: com.alibaba.druid.pool.DruidDataSource + initialSize: 5 + minIdle: 5 + maxActive: 20 + maxWait: 60000 + timeBetweenEvictionRunsMillis: 60000 + minEvictableIdleTimeMillis: 300000 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + poolPreparedStatements: true + #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + filters: stat,wall,log4j + maxPoolPreparedStatementPerConnectionSize: 20 + useGlobalDataSourceStat: true + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 + + +server: + port: 9019 + diff --git a/SpringBoot-PgSQL/src/test/java/com/fancv/AppTest.java b/SpringBoot-PgSQL/src/test/java/com/fancv/AppTest.java new file mode 100644 index 0000000..84d0c0b --- /dev/null +++ b/SpringBoot-PgSQL/src/test/java/com/fancv/AppTest.java @@ -0,0 +1,20 @@ +package com.fancv; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/SpringBoot-Redis/src/main/resources/application.properties b/SpringBoot-Redis/src/main/resources/application.properties deleted file mode 100644 index 0faaf5e..0000000 --- a/SpringBoot-Redis/src/main/resources/application.properties +++ /dev/null @@ -1,26 +0,0 @@ -# RedisӶ˿ -spring.redis.port=6379 -# Redisַ -spring.redis.host=127.0.0.1 -# RedisݿĬΪ0 -spring.redis.database=5 -# Redis루ĬΪգ -spring.redis.password= "" -# ӳʹøֵʾûƣ -spring.redis.jedis.pool.max-active=8 -# ӳȴʱ䣨ʹøֵʾûƣ -spring.redis.jedis.pool.max-wait=-1ms -# ӳе -spring.redis.jedis.pool.max-idle=8 -# ӳеС -spring.redis.jedis.pool.min-idle=0 -# ӳʱʱ䣨룩 -spring.redis.timeout=5000ms - -#redis ڱRedis Server -spring.redis.sentinel.master=devwj -# comma-separated list of host:port pairs ڱб -spring.redis.sentinel.nodes=192.168.5.86:28001,192.168.5.86:28002,192.168.5.86:28003 - -server.port=9093 - diff --git a/SpringBoot-Redis/src/main/resources/application.yaml b/SpringBoot-Redis/src/main/resources/application.yaml new file mode 100644 index 0000000..ea8e435 --- /dev/null +++ b/SpringBoot-Redis/src/main/resources/application.yaml @@ -0,0 +1,8 @@ +#redis 配置 +spring: + redis: + port: 6379 + host: 127.0.0.1 + database: 10 +server: + port: 9010 \ No newline at end of file diff --git a/SpringBoot-Security/src/main/java/com/fancv/SpringSecurityApplicationStart.java b/SpringBoot-Security/src/main/java/com/fancv/SpringSecurityApplicationStart.java index 8940b00..70daab7 100644 --- a/SpringBoot-Security/src/main/java/com/fancv/SpringSecurityApplicationStart.java +++ b/SpringBoot-Security/src/main/java/com/fancv/SpringSecurityApplicationStart.java @@ -3,6 +3,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import springfox.documentation.swagger2.annotations.EnableSwagger2; /** * Hello world! @@ -10,6 +11,7 @@ */ @SpringBootApplication @EnableResourceServer +@EnableSwagger2 public class SpringSecurityApplicationStart { public static void main( String[] args ) diff --git a/SpringBoot-Security/src/main/java/com/fancv/config/WebSecurityConfig.java b/SpringBoot-Security/src/main/java/com/fancv/config/WebSecurityConfig.java index be4e852..1aa47f6 100644 --- a/SpringBoot-Security/src/main/java/com/fancv/config/WebSecurityConfig.java +++ b/SpringBoot-Security/src/main/java/com/fancv/config/WebSecurityConfig.java @@ -41,7 +41,7 @@ protected void configure(AuthenticationManagerBuilder auth) throws Exception { /** * 开放/login和/oauth/authorize两个路径的匿名访问。前者用于登录,后者用于换授权码,这两个端点访问的时机都在登录之前。 - * 设置/login使用表单验证进行登录。 + * 设置/login使用表单验证进行登录。 未生效 * @param http * @throws Exception */ diff --git a/SpringBoot-Security/src/main/resources/application.yaml b/SpringBoot-Security/src/main/resources/application.yaml index b9281ae..8c933c6 100644 --- a/SpringBoot-Security/src/main/resources/application.yaml +++ b/SpringBoot-Security/src/main/resources/application.yaml @@ -37,4 +37,4 @@ server: logging: level: - root: debug \ No newline at end of file + root: info \ No newline at end of file diff --git a/pom.xml b/pom.xml index a769ffb..2317556 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,8 @@ SpringBoot-OSS SpringBoot-Commons SpringBoot-DynamicDataSource + SpringBoot-Security + SpringBoot-JavaReactor