From 57dfc89f777203af62417c2aad85b4902aa31f5d Mon Sep 17 00:00:00 2001 From: zhangtao Date: Wed, 27 Feb 2019 16:50:27 +0800 Subject: [PATCH 01/26] =?UTF-8?q?WebFlux=20=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=9A=84=E5=87=A0=E7=A7=8D=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E5=8F=8ASSE=E6=A8=A1=E5=BC=8F=E7=AD=89=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E5=BC=8F=E7=BC=96=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringWebFluxDemo/pom.xml | 48 +++++++++++++++++ .../flux/SpringWebFluxDemoApplication.java | 13 +++++ .../flux/controller/HelloWorlController.java | 24 +++++++++ .../xiaour/flux/controller/SSEController.java | 34 ++++++++++++ .../flux/controller/UserController.java | 53 +++++++++++++++++++ .../com/github/xiaour/flux/entity/User.java | 40 ++++++++++++++ .../xiaour/flux/service/UserService.java | 44 +++++++++++++++ .../src/main/resources/application.properties | 1 + 8 files changed, 257 insertions(+) create mode 100644 SpringWebFluxDemo/pom.xml create mode 100644 SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/SpringWebFluxDemoApplication.java create mode 100644 SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/HelloWorlController.java create mode 100644 SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/SSEController.java create mode 100644 SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/UserController.java create mode 100644 SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/entity/User.java create mode 100644 SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/service/UserService.java create mode 100644 SpringWebFluxDemo/src/main/resources/application.properties diff --git a/SpringWebFluxDemo/pom.xml b/SpringWebFluxDemo/pom.xml new file mode 100644 index 0000000..a1aa877 --- /dev/null +++ b/SpringWebFluxDemo/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + com.github.xiaour + flux + 0.0.1-SNAPSHOT + SpringWebFluxDemo + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-webflux + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/SpringWebFluxDemoApplication.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/SpringWebFluxDemoApplication.java new file mode 100644 index 0000000..d13a52c --- /dev/null +++ b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/SpringWebFluxDemoApplication.java @@ -0,0 +1,13 @@ +package com.github.xiaour.flux; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringWebFluxDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringWebFluxDemoApplication.class, args); + } + +} diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/HelloWorlController.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/HelloWorlController.java new file mode 100644 index 0000000..f45ae29 --- /dev/null +++ b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/HelloWorlController.java @@ -0,0 +1,24 @@ +package com.github.xiaour.flux.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + +/** + * @Author: cityuu@163.com + * @Date: 2019-02-27 16:26 + * @version: v1.0 + * @Description: 入门案例 + */ + +@RestController +@RequestMapping("/") +public class HelloWorlController { + + @GetMapping("hello") + public Mono hello(){ + return Mono.just("hello World!"); + } + +} diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/SSEController.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/SSEController.java new file mode 100644 index 0000000..d1d4a06 --- /dev/null +++ b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/SSEController.java @@ -0,0 +1,34 @@ +package com.github.xiaour.flux.controller; + +import io.netty.util.internal.ThreadLocalRandom; +import org.springframework.http.codec.ServerSentEvent; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; +import reactor.util.function.Tuples; + +import java.time.Duration; + +/** + * @Author: zhangtao@suiyueyule.com + * @Date: 2019-02-27 16:37 + * @version: v1.0 + * @Description: 服务器推送接口 + */ +@RestController +@RequestMapping("/sse") +public class SSEController { + + @GetMapping("/randomNumbers") + public Flux> randomNumbers() { + return Flux.interval(Duration.ofSeconds(2)) + .map(seq -> Tuples.of(seq, ThreadLocalRandom.current().nextInt())) + .map(data -> ServerSentEvent.builder() + .event("random") + .id(Long.toString(data.getT1())) + .data(data.getT2()) + .build()); + } + +} diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/UserController.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/UserController.java new file mode 100644 index 0000000..823df9b --- /dev/null +++ b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/UserController.java @@ -0,0 +1,53 @@ +package com.github.xiaour.flux.controller; + +import com.github.xiaour.flux.entity.User; +import com.github.xiaour.flux.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.Objects; + +/** + * @Author: cityuu@163.com + * @Date: 2019-02-27 16:33 + * @version: v1.0 + * @Description: 用户管理接口 + */ +@RestController +@RequestMapping("/user") +public class UserController { + + @Autowired + private UserService userService; + + + @GetMapping("") + public Flux list() { + return userService.list(); + } + + @GetMapping("/{id}") + public Mono getById(@PathVariable("id") final String id) { + return this.userService.getById(id); + } + + @PostMapping("") + public Mono create(@RequestBody final User user) { + return this.userService.createOrUpdate(user); + } + + @PutMapping("/{id}") + public Mono update(@PathVariable("id") final String id, @RequestBody final User user) { + Objects.requireNonNull(user); + user.setId(id); + return this.userService.createOrUpdate(user); + } + + @DeleteMapping("/{id}") + public Mono delete(@PathVariable("id") final String id) { + return this.userService.delete(id); + } + +} diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/entity/User.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/entity/User.java new file mode 100644 index 0000000..9a9f9a5 --- /dev/null +++ b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/entity/User.java @@ -0,0 +1,40 @@ +package com.github.xiaour.flux.entity; + +/** + * @Author: cityuu@suiyueyule.com + * @Date: 2019-02-27 16:31 + * @version: v1.0 + * @Description: + */ +public class User { + + private String id; + + private String name; + + private Integer age; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } +} diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/service/UserService.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/service/UserService.java new file mode 100644 index 0000000..0d39680 --- /dev/null +++ b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/service/UserService.java @@ -0,0 +1,44 @@ +package com.github.xiaour.flux.service; + +import com.github.xiaour.flux.entity.User; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @Author: cityuu@suiyueyule.com + * @Date: 2019-02-27 16:30 + * @version: v1.0 + * @Description: + */ +@Service +public class UserService { + + private final Map data = new ConcurrentHashMap<>(); + + public Flux list() { + return Flux.fromIterable(this.data.values()); + } + + public Flux getById(final Flux ids) { + return ids.flatMap(id -> Mono.justOrEmpty(this.data.get(id))); + } + + public Mono getById(final String id) { + return Mono.justOrEmpty(this.data.get(id)); + } + + public Mono createOrUpdate(final User user) { + this.data.put(user.getId(), user); + return Mono.just(user); + } + + public Mono delete(final String id) { + return Mono.justOrEmpty(this.data.remove(id)); + } + + +} diff --git a/SpringWebFluxDemo/src/main/resources/application.properties b/SpringWebFluxDemo/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/SpringWebFluxDemo/src/main/resources/application.properties @@ -0,0 +1 @@ + From 533118af6a84afb646d2c06e2a60fd3216d6ca59 Mon Sep 17 00:00:00 2001 From: zhangtao Date: Wed, 27 Feb 2019 16:52:42 +0800 Subject: [PATCH 02/26] =?UTF-8?q?WebFlux=20=E6=96=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=9A=84=E5=87=A0=E7=A7=8D=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E5=8F=8ASSE=E6=A8=A1=E5=BC=8F=E7=AD=89=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E5=BC=8F=E7=BC=96=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ba9cfcb..07dd19b 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ 3.[Springboot集成RocketMQ](https://xiaour.github.io/2018/08/16/SpringbootRocketMQ/) +4.Webflux Spring异步编程,你将发现新大陆(代码已经部分上传,blog完善中...) ### 代码部分 From eff0ee54be3cb0d1983d297667f419d2f39b8535 Mon Sep 17 00:00:00 2001 From: "xiaour.zhang" Date: Tue, 9 Apr 2019 16:14:17 +0800 Subject: [PATCH 03/26] Update SSEController.java --- .../java/com/github/xiaour/flux/controller/SSEController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/SSEController.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/SSEController.java index d1d4a06..dbbba46 100644 --- a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/SSEController.java +++ b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/SSEController.java @@ -11,7 +11,7 @@ import java.time.Duration; /** - * @Author: zhangtao@suiyueyule.com + * @Author: cityuu@163.com * @Date: 2019-02-27 16:37 * @version: v1.0 * @Description: 服务器推送接口 From 59c1642306f4b754e22cb463769f01b24e427a96 Mon Sep 17 00:00:00 2001 From: "xiaour.zhang" Date: Thu, 24 Oct 2019 16:08:09 +0800 Subject: [PATCH 04/26] Delete maven-wrapper.jar --- SpringBootDemoV2/.mvn/wrapper/maven-wrapper.jar | Bin 47610 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 SpringBootDemoV2/.mvn/wrapper/maven-wrapper.jar diff --git a/SpringBootDemoV2/.mvn/wrapper/maven-wrapper.jar b/SpringBootDemoV2/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 9cc84ea9b4d95453115d0c26488d6a78694e0bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47610 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 From d953269f8959a951b86d7bd3b29c45b6d0120466 Mon Sep 17 00:00:00 2001 From: "xiaour.zhang" Date: Thu, 24 Oct 2019 16:08:19 +0800 Subject: [PATCH 05/26] Delete maven-wrapper.properties --- SpringBootDemoV2/.mvn/wrapper/maven-wrapper.properties | 1 - 1 file changed, 1 deletion(-) delete mode 100644 SpringBootDemoV2/.mvn/wrapper/maven-wrapper.properties diff --git a/SpringBootDemoV2/.mvn/wrapper/maven-wrapper.properties b/SpringBootDemoV2/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 9dda3b6..0000000 --- a/SpringBootDemoV2/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1 +0,0 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip From ed277e68daeb38a8668a9c41563f5d42aa590f37 Mon Sep 17 00:00:00 2001 From: zhangtao Date: Thu, 24 Oct 2019 16:50:37 +0800 Subject: [PATCH 06/26] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xiaour/spring/boot/Application.java | 91 +++--- .../exception/DingTalkEncryptException.java | 53 ---- .../spring/boot/mapper/UserInfoMapper.java | 20 +- .../xiaour/spring/boot/utils/ExcelHander.java | 280 ------------------ .../xiaour/spring/boot/utils/JsonUtil.java | 170 +++++------ .../xiaour/spring/boot/utils/POIUtils.java | 228 -------------- .../src/main/resources/application.yml | 91 +++--- SpringBootKafkaDemo/pom.xml | 7 +- .../spring/boot/kafka/KafkaApplication.class | Bin 730 -> 760 bytes .../spring/boot/kafka/consumer/Consumer.class | Bin 1697 -> 1727 bytes .../spring/boot/kafka/producer/Message.class | Bin 1001 -> 1053 bytes SpringWebFluxDemo/.gitignore | 26 ++ .../SpringWebFluxDemoApplicationTests.java | 16 + 13 files changed, 226 insertions(+), 756 deletions(-) delete mode 100644 SpringBootDemo/src/main/java/com/xiaour/spring/boot/exception/DingTalkEncryptException.java delete mode 100644 SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/ExcelHander.java delete mode 100644 SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/POIUtils.java create mode 100644 SpringWebFluxDemo/.gitignore create mode 100644 SpringWebFluxDemo/src/test/java/com/github/xiaour/flux/SpringWebFluxDemoApplicationTests.java diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/Application.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/Application.java index db70642..ba66900 100644 --- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/Application.java +++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/Application.java @@ -1,46 +1,45 @@ -package com.xiaour.spring.boot; - -import org.mybatis.spring.annotation.MapperScan; -import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; -import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; -import org.springframework.boot.web.servlet.ServletComponentScan; -import org.springframework.boot.web.support.SpringBootServletInitializer; - -/** - * - * @ClassName Application - * @author Zhang.Tao - * @Date 2017年4月27日 下午5:30:34 - * @version V2.0.0 - */ - -@SpringBootApplication(exclude = MybatisAutoConfiguration.class) -@ServletComponentScan -@EnableAutoConfiguration -@MapperScan("com.xiaour.spring.boot.mapper") -public class Application extends SpringBootServletInitializer implements EmbeddedServletContainerCustomizer { - - @Value("${server.port}") - private int port;//应用的端口 - /** - * 启动入口 - * @param args - */ - public static void main(String ... args){ - SpringApplication.run(Application.class, args); - } - - /** - * 自定义端口 - */ - @Override - public void customize(ConfigurableEmbeddedServletContainer container) { - container.setPort(port); - } - -} +package com.xiaour.spring.boot; + +import org.mybatis.spring.annotation.MapperScan; +import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; +import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * + * @ClassName Application + * @author Zhang.Tao + * @Date 2017年4月27日 下午5:30:34 + * @version V2.0.0 + */ + +@SpringBootApplication(exclude = MybatisAutoConfiguration.class) +@ServletComponentScan +@MapperScan("com.xiaour.spring.boot.mapper") +public class Application extends SpringBootServletInitializer implements EmbeddedServletContainerCustomizer { + + @Value("${server.port}") + private int port;//应用的端口 + /** + * 启动入口 + * @param args + */ + public static void main(String ... args){ + SpringApplication.run(Application.class, args); + } + + /** + * 自定义端口 + */ + @Override + public void customize(ConfigurableEmbeddedServletContainer container) { + container.setPort(port); + } + +} diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/exception/DingTalkEncryptException.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/exception/DingTalkEncryptException.java deleted file mode 100644 index f279b8e..0000000 --- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/exception/DingTalkEncryptException.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.xiaour.spring.boot.exception; - -import java.util.HashMap; -import java.util.Map; - -/** - * 钉钉开放平台加解密异常类 - */ -public class DingTalkEncryptException extends Exception { - /**成功**/ - public static final int SUCCESS = 0; - /**加密明文文本非法**/ - public final static int ENCRYPTION_PLAINTEXT_ILLEGAL = 900001; - /**加密时间戳参数非法**/ - public final static int ENCRYPTION_TIMESTAMP_ILLEGAL = 900002; - /**加密随机字符串参数非法**/ - public final static int ENCRYPTION_NONCE_ILLEGAL = 900003; - /**不合法的aeskey**/ - public final static int AES_KEY_ILLEGAL = 900004; - /**签名不匹配**/ - public final static int SIGNATURE_NOT_MATCH = 900005; - /**计算签名错误**/ - public final static int COMPUTE_SIGNATURE_ERROR = 900006; - /**计算加密文字错误**/ - public final static int COMPUTE_ENCRYPT_TEXT_ERROR = 900007; - /**计算解密文字错误**/ - public final static int COMPUTE_DECRYPT_TEXT_ERROR = 900008; - /**计算解密文字长度不匹配**/ - public final static int COMPUTE_DECRYPT_TEXT_LENGTH_ERROR = 900009; - /**计算解密文字corpid不匹配**/ - public final static int COMPUTE_DECRYPT_TEXT_CORPID_ERROR = 900010; - - private static Map msgMap = new HashMap(); - static{ - msgMap.put(SUCCESS,"成功"); - msgMap.put(ENCRYPTION_PLAINTEXT_ILLEGAL,"加密明文文本非法"); - msgMap.put(ENCRYPTION_TIMESTAMP_ILLEGAL,"加密时间戳参数非法"); - msgMap.put(ENCRYPTION_NONCE_ILLEGAL,"加密随机字符串参数非法"); - msgMap.put(SIGNATURE_NOT_MATCH,"签名不匹配"); - msgMap.put(COMPUTE_SIGNATURE_ERROR,"签名计算失败"); - msgMap.put(AES_KEY_ILLEGAL,"不合法的aes key"); - msgMap.put(COMPUTE_ENCRYPT_TEXT_ERROR,"计算加密文字错误"); - msgMap.put(COMPUTE_DECRYPT_TEXT_ERROR,"计算解密文字错误"); - msgMap.put(COMPUTE_DECRYPT_TEXT_LENGTH_ERROR,"计算解密文字长度不匹配"); - msgMap.put(COMPUTE_DECRYPT_TEXT_CORPID_ERROR,"计算解密文字corpid或者suiteKey不匹配"); - } - - public Integer code; - public DingTalkEncryptException(Integer exceptionCode){ - super(msgMap.get(exceptionCode)); - this.code = exceptionCode; - } -} diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/mapper/UserInfoMapper.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/mapper/UserInfoMapper.java index 9850a58..50cb43f 100644 --- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/mapper/UserInfoMapper.java +++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/mapper/UserInfoMapper.java @@ -1,9 +1,13 @@ -package com.xiaour.spring.boot.mapper; - -import com.xiaour.spring.boot.entity.UserInfo; - -public interface UserInfoMapper { - - UserInfo selectByPrimaryKey(Integer id); - +package com.xiaour.spring.boot.mapper; + +import com.xiaour.spring.boot.entity.UserInfo; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Component; + +@Component +@Mapper +public interface UserInfoMapper { + + UserInfo selectByPrimaryKey(Integer id); + } \ No newline at end of file diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/ExcelHander.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/ExcelHander.java deleted file mode 100644 index 28b41ed..0000000 --- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/ExcelHander.java +++ /dev/null @@ -1,280 +0,0 @@ -package com.xiaour.spring.boot.utils; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.text.DecimalFormat; -import java.util.Date; -import java.util.HashMap; - -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.streaming.SXSSFSheet; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.apache.poi.xssf.usermodel.XSSFRichTextString; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; - - -public class ExcelHander { - /** - * 取得指定单元格行和列 - * @param keyMap 所有单元格行、列集合 - * @param key 单元格标识 - * @return 0:列 1:行(列表型数据不记行,即1无值) - */ - public static int[] getPos(HashMap keyMap, String key){ - int[] ret = new int[0]; - - String val = (String)keyMap.get(key); - - if(val == null || val.length() == 0) - return ret; - - String pos[] = val.split(","); - - if(pos.length == 1 || pos.length == 2){ - ret = new int[pos.length]; - for(int i0 = 0; i0 < pos.length; i0++){ - if(pos[i0] != null && pos[i0].trim().length() > 0){ - ret[i0] = Integer.parseInt(pos[i0].trim()); - } else { - ret[i0] = 0; - } - } - } - return ret; - } - - /** - * 取对应格子的值 - * @param sheet - * @param rowNo 行 - * @param cellNo 列 - * @return - * @throws IOException - */ - public static String getCellValue(Sheet sheet,int rowNo,int cellNo) { - String cellValue = null; - Row row = sheet.getRow(rowNo); - Cell cell = row.getCell(cellNo); - if (cell != null) { - if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { - DecimalFormat df = new DecimalFormat("0"); - cellValue = getCutDotStr(df.format(cell.getNumericCellValue())); - } else if (cell.getCellType() == Cell.CELL_TYPE_STRING) { - cellValue = cell.getStringCellValue(); - } - if (cellValue != null) { - cellValue = cellValue.trim(); - } - } else { - cellValue = null; - } - return cellValue; - } - - /** - * 取整数 - * @param srcString - * @return - */ - private static String getCutDotStr(String srcString) { - String newString = ""; - if (srcString != null && srcString.endsWith(".0")) { - newString = srcString.substring(0,srcString.length()-2); - } else { - newString = srcString; - } - return newString; - } - - /** - * 读数据模板 - * @throws IOException - */ - public static HashMap[] getTemplateFile(String templateFileName) throws IOException { - FileInputStream fis = new FileInputStream(templateFileName); - - Workbook wbPartModule = null; - if(templateFileName.endsWith(".xlsx")){ - wbPartModule = new XSSFWorkbook(fis); - }else if(templateFileName.endsWith(".xls")){ - wbPartModule = new HSSFWorkbook(fis); - } - - int numOfSheet = wbPartModule.getNumberOfSheets(); - HashMap[] templateMap = new HashMap[numOfSheet]; - for(int i = 0; i < numOfSheet; i++){ - Sheet sheet = wbPartModule.getSheetAt(i); - templateMap[i] = new HashMap(); - readSheet(templateMap[i], sheet); - } - fis.close(); - return templateMap; - } - - /** - * @throws Exception - * - * @Title: getTemplateFile - * @Description: 获取对应的模板sheet - * @param @param templateFileName - * @param @param sheetName - * @param @return - * @param @throws IOException 设定文件 - * @return HashMap[] 返回类型 - * @throws - */ - public static void getTemplateSheet(SXSSFSheet targetSheet, SXSSFWorkbook targetWork,InputStream fis,String sheetName) throws Exception { - - XSSFWorkbook xs = new XSSFWorkbook(fis); - SXSSFWorkbook wbPartModule = new SXSSFWorkbook(xs); - XSSFSheet sheetTemp1 = null; - int numOfSheet1 = xs.getNumberOfSheets(); - //获取 - for(int i = 0; i < numOfSheet1; i++){ - XSSFSheet sheet = xs.getSheetAt(i); - if (sheet != null) { - String name = sheet.getSheetName(); - if (sheetName.equals(name)) { - sheetTemp1 = sheet; - } - } - } - - POIUtils.copySheet(targetSheet, sheetTemp1, targetWork, wbPartModule); - fis.close(); - } - /** - * 读模板数据的样式值置等信息 - * @param keyMap - * @param sheet - */ - private static void readSheet(HashMap keyMap, Sheet sheet){ - int firstRowNum = sheet.getFirstRowNum(); - int lastRowNum = sheet.getLastRowNum(); - System.out.println("当前sheet名称 -------------"+sheet.getSheetName()); - for (int j = firstRowNum; j <= lastRowNum; j++) { - Row rowIn = sheet.getRow(j); - if(rowIn == null) { - continue; - } - int firstCellNum = rowIn.getFirstCellNum(); - int lastCellNum = rowIn.getLastCellNum(); - for (int k = firstCellNum; k <= lastCellNum; k++) { -// Cell cellIn = rowIn.getCell((short) k); - Cell cellIn = rowIn.getCell(k); - if(cellIn == null) { - continue; - } - - int cellType = cellIn.getCellType(); - if(Cell.CELL_TYPE_STRING != cellType) { - continue; - } - String cellValue = cellIn.getStringCellValue(); - if(cellValue == null) { - continue; - } - cellValue = cellValue.trim(); - if(cellValue.length() > 2 && cellValue.substring(0,2).equals("<%")) { - String key = cellValue.substring(2, cellValue.length()); - String keyPos = Integer.toString(k)+","+Integer.toString(j); - keyMap.put(key, keyPos); - keyMap.put(key+"CellStyle", cellIn.getCellStyle()); - } else if(cellValue.length() > 3 && cellValue.substring(0,3).equals(" keyMap, String key,Workbook wb) { - CellStyle cellStyle = null; - - cellStyle = (CellStyle) keyMap.get(key+"CellStyle"); - //当字符超出时换行 - cellStyle.setWrapText(true); - CellStyle newStyle = wb.createCellStyle(); - newStyle.cloneStyleFrom(cellStyle); - return newStyle; - } - /** - * Excel单元格输出 - * @param sheet - * @param row 行 - * @param cell 列 - * @param value 值 - * @param cellStyle 样式 - */ - public static void setValue(Sheet sheet, int row, int cell, Object value, CellStyle cellStyle){ - Row rowIn = sheet.getRow(row); - if(rowIn == null) { - rowIn = sheet.createRow(row); - } - Cell cellIn = rowIn.getCell(cell); - if(cellIn == null) { - cellIn = rowIn.createCell(cell); - } - if(cellStyle != null) { - //修复产生多超过4000 cellStyle 异常 - //CellStyle newStyle = wb.createCellStyle(); - //newStyle.cloneStyleFrom(cellStyle); - cellIn.setCellStyle(cellStyle); - } - //对时间格式进行单独处理 - if(value==null){ - cellIn.setCellValue(""); - }else{ - if (isCellDateFormatted(cellStyle)) { - cellIn.setCellValue((Date) value); - } else { - cellIn.setCellValue(new XSSFRichTextString(value.toString())); - } - } - } - - /** - * 根据表格样式判断是否为日期格式 - * @param cellStyle - * @return - */ - public static boolean isCellDateFormatted(CellStyle cellStyle){ - if(cellStyle==null){ - return false; - } - int i = cellStyle.getDataFormat(); - String f = cellStyle.getDataFormatString(); - - return org.apache.poi.ss.usermodel.DateUtil.isADateFormat(i, f); - } - /** - * 适用于导出的数据Excel格式样式重复性较少 - * 不适用于循环方法中使用 - * @param wbModule - * @param sheet - * @param pos 模板文件信息 - * @param startCell 开始的行 - * @param value 要填充的数据 - * @param cellStyle 表格样式 - */ - public static void createCell(Workbook wbModule, Sheet sheet,HashMap pos, int startCell,Object value,String cellStyle){ - int[] excelPos = getPos(pos, cellStyle); - setValue(sheet, startCell, excelPos[0], value, getStyle(pos, cellStyle,wbModule)); - } - -} diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/JsonUtil.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/JsonUtil.java index d392db9..66be6e2 100644 --- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/JsonUtil.java +++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/JsonUtil.java @@ -1,89 +1,83 @@ -package com.xiaour.spring.boot.utils; - -import com.google.gson.*; -import com.google.gson.reflect.TypeToken; - -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class JsonUtil { - - private static Gson gson = null; - - static{ - gson = new Gson(); - } - - public static synchronized Gson newInstance(){ - if(gson == null){ - gson = new Gson(); - } - return gson; - } - - public static String getJsonString(Object obj){ - return gson.toJson(obj); - } - - public static T toBean(String json,Class clz){ - - return gson.fromJson(json, clz); - } - - public static Map readJson2MapObj(String json,Class clz){ - Map map = gson.fromJson(json, new TypeToken>(){}.getType()); - Map result = new HashMap<>(); - for(String key:map.keySet()){ - result.put(key,gson.fromJson(map.get(key),clz) ); - } - return result; - } - - public static T json2Obj(String json,Class clz){ - return gson.fromJson(json,clz); - } - - public static Map toMap(String json){ - Map map = gson.fromJson(json, new TypeToken>(){}.getType()); - return map; - } - - public static Map readJsonStrMap(String json) { - Map map = gson.fromJson(json, new TypeToken>(){}.getType()); - Map result = new HashMap<>(); - for(String key:map.keySet()){ - result.put(key,gson.fromJson(map.get(key),String.class) ); - } - return result; - } - - public static Map readJsonByteMap(String json) { - Map map = gson.fromJson(json, new TypeToken>(){}.getType()); - Map vmap = new HashMap<>(); - for(String key:map.keySet()){ - vmap.put(key.getBytes(),gson.fromJson(map.get(key),String.class).getBytes() ); - } - return vmap; - - } - - - public static List readJson2Array(String json, Class clz){ - JsonArray array = new JsonParser().parse(json).getAsJsonArray(); - List list = new ArrayList<>(); - for(final JsonElement elem : array){ - list.add(gson.fromJson(elem, (Type)clz)); - } - return list; - } - - - public static void main(String[] args) { - String json="{\"snapshots\":[{\"snapshot\":\"snapshot_129\",\"uuid\":\"kaM9ip2GQoCsT3wn38OcsQ\",\"version_id\":5040399,\"version\":\"5.4.3\",\"indices\":[\"metricbeat-2018.01.04\",\"metricbeat-2018.01.03\",\"metricbeat-2017.12.11\",\"metricbeat-2017.12.23\",\"metricbeat-2018.01.29\",\"metricbeat-2017.12.17\",\"metricbeat-2017.12.05\",\"metricbeat-2018.01.26\",\"metricbeat-2017.12.16\",\"metricbeat-2017.12.30\",\"metricbeat-2017.12.29\"],\"state\":\"SUCCESS\",\"duration_in_millis\":4310,\"failures\":[],\"shards\":{\"total\":321,\"failed\":0,\"successful\":321}}]}"; - - System.out.println(toMap(json)); - } +package com.xiaour.spring.boot.utils; + +import com.google.gson.*; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class JsonUtil { + + private static Gson gson = null; + + static{ + gson = new Gson(); + } + + public static synchronized Gson newInstance(){ + if(gson == null){ + gson = new Gson(); + } + return gson; + } + + public static String getJsonString(Object obj){ + return gson.toJson(obj); + } + + public static T toBean(String json,Class clz){ + + return gson.fromJson(json, clz); + } + + public static Map readJson2MapObj(String json,Class clz){ + Map map = gson.fromJson(json, new TypeToken>(){}.getType()); + Map result = new HashMap<>(); + for(String key:map.keySet()){ + result.put(key,gson.fromJson(map.get(key),clz) ); + } + return result; + } + + public static T json2Obj(String json,Class clz){ + return gson.fromJson(json,clz); + } + + public static Map toMap(String json){ + Map map = gson.fromJson(json, new TypeToken>(){}.getType()); + return map; + } + + public static Map readJsonStrMap(String json) { + Map map = gson.fromJson(json, new TypeToken>(){}.getType()); + Map result = new HashMap<>(); + for(String key:map.keySet()){ + result.put(key,gson.fromJson(map.get(key),String.class) ); + } + return result; + } + + public static Map readJsonByteMap(String json) { + Map map = gson.fromJson(json, new TypeToken>(){}.getType()); + Map vmap = new HashMap<>(); + for(String key:map.keySet()){ + vmap.put(key.getBytes(),gson.fromJson(map.get(key),String.class).getBytes() ); + } + return vmap; + + } + + + public static List readJson2Array(String json, Class clz){ + JsonArray array = new JsonParser().parse(json).getAsJsonArray(); + List list = new ArrayList<>(); + for(final JsonElement elem : array){ + list.add(gson.fromJson(elem, (Type)clz)); + } + return list; + } + } \ No newline at end of file diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/POIUtils.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/POIUtils.java deleted file mode 100644 index 83a90fb..0000000 --- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/POIUtils.java +++ /dev/null @@ -1,228 +0,0 @@ -package com.xiaour.spring.boot.utils; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.poi.hssf.usermodel.HSSFCell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Comment; -import org.apache.poi.ss.usermodel.Drawing; -import org.apache.poi.ss.util.CellRangeAddress; -import org.apache.poi.xssf.streaming.SXSSFCell; -import org.apache.poi.xssf.streaming.SXSSFRow; -import org.apache.poi.xssf.streaming.SXSSFSheet; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.apache.poi.xssf.usermodel.XSSFCell; -import org.apache.poi.xssf.usermodel.XSSFCellStyle; -import org.apache.poi.xssf.usermodel.XSSFClientAnchor; -import org.apache.poi.xssf.usermodel.XSSFRow; -import org.apache.poi.xssf.usermodel.XSSFSheet; - -/** - * -* @ClassName: POIUtils -* @Description: POIUtils工具类 -* - */ -public class POIUtils { - - /** - * 功能:拷贝sheet - * 实际调用 copySheet(targetSheet, sourceSheet, targetWork, sourceWork, true) - * @param targetSheet - * @param sourceSheet - * @param targetWork - * @param sourceWork - */ - public static void copySheet(SXSSFSheet targetSheet, XSSFSheet sourceSheet, - SXSSFWorkbook targetWork, SXSSFWorkbook sourceWork) throws Exception{ - if(targetSheet == null || sourceSheet == null || targetWork == null || sourceWork == null){ - throw new IllegalArgumentException("调用PoiUtil.copySheet()方法时,targetSheet、sourceSheet、targetWork、sourceWork都不能为空,故抛出该异常!"); - } - copySheet(targetSheet, sourceSheet, targetWork, sourceWork, true); - } - - /** - * 功能:拷贝sheet - * @param targetSheet - * @param sourceSheet - * @param targetWork - * @param sourceWork - * @param copyStyle boolean 是否拷贝样式 - */ - public static void copySheet(SXSSFSheet targetSheet, XSSFSheet sourceSheet, - SXSSFWorkbook targetWork, SXSSFWorkbook sourceWork, boolean copyStyle)throws Exception { - - if(targetSheet == null || sourceSheet == null || targetWork == null || sourceWork == null){ - throw new IllegalArgumentException("调用PoiUtil.copySheet()方法时,targetSheet、sourceSheet、targetWork、sourceWork都不能为空,故抛出该异常!"); - } - - //复制源表中的行 - int maxColumnNum = 0; - - Map styleMap = (copyStyle) ? new HashMap() : null; - - Drawing patriarch = targetSheet.createDrawingPatriarch(); //用于复制注释 - for (int i = sourceSheet.getFirstRowNum(); i <= sourceSheet.getLastRowNum(); i++) { - XSSFRow sourceRow = sourceSheet.getRow(i); - SXSSFRow targetRow = (SXSSFRow) targetSheet.createRow(i); - - if (sourceRow != null) { - copyRow(targetRow, sourceRow, - targetWork, sourceWork,patriarch, styleMap); - if (sourceRow.getLastCellNum() > maxColumnNum) { - - maxColumnNum = sourceRow.getLastCellNum(); - } - } - } - - //复制源表中的合并单元格 - mergerRegion(targetSheet, sourceSheet); - - //设置目标sheet的列宽 - if (maxColumnNum > 100) { - maxColumnNum = 100; - } - for (int i = 0; i <= maxColumnNum; i++) { - targetSheet.setColumnWidth(i, sourceSheet.getColumnWidth(i)); - } - } - - /** - * 功能:拷贝row - * @param targetRow - * @param sourceRow - * @param styleMap - * @param targetWork - * @param sourceWork - * @param targetPatriarch - */ - public static void copyRow(SXSSFRow targetRow, XSSFRow sourceRow, - SXSSFWorkbook targetWork, SXSSFWorkbook sourceWork,Drawing targetPatriarch, Map styleMap) throws Exception { - if(targetRow == null || sourceRow == null || targetWork == null || sourceWork == null || targetPatriarch == null){ - throw new IllegalArgumentException("调用PoiUtil.copyRow()方法时,targetRow、sourceRow、targetWork、sourceWork、targetPatriarch都不能为空,故抛出该异常!"); - } - - //设置行高 - targetRow.setHeight(sourceRow.getHeight()); - - for (int i = sourceRow.getFirstCellNum(); i <= sourceRow.getLastCellNum(); i++) { - XSSFCell sourceCell = sourceRow.getCell(i); - SXSSFCell targetCell = (SXSSFCell) targetRow.getCell(i); - - if (sourceCell != null) { - if (targetCell == null) { - targetCell = (SXSSFCell) targetRow.createCell(i); - } - - //拷贝单元格,包括内容和样式 - copyCell(targetCell, sourceCell, targetWork, sourceWork, styleMap); - - //拷贝单元格注释 - copyComment(targetCell,sourceCell,targetPatriarch); - } - } - } - - /** - * 功能:拷贝cell,依据styleMap是否为空判断是否拷贝单元格样式 - * @param targetCell 不能为空 - * @param sourceCell 不能为空 - * @param targetWork 不能为空 - * @param sourceWork 不能为空 - * @param styleMap 可以为空 - */ - public static void copyCell(SXSSFCell targetCell, XSSFCell sourceCell, SXSSFWorkbook targetWork, SXSSFWorkbook sourceWork,Map styleMap) { - if(targetCell == null || sourceCell == null || targetWork == null || sourceWork == null ){ - throw new IllegalArgumentException("调用PoiUtil.copyCell()方法时,targetCell、sourceCell、targetWork、sourceWork都不能为空,故抛出该异常!"); - } - - //处理单元格样式 - if(styleMap != null){ - if (targetWork == sourceWork) { - targetCell.setCellStyle(sourceCell.getCellStyle()); - } else { - String stHashCode = "" + sourceCell.getCellStyle().hashCode(); - CellStyle targetCellStyle = (XSSFCellStyle) styleMap - .get(stHashCode); - if (targetCellStyle == null) { - targetCellStyle = targetWork.createCellStyle(); - targetCellStyle.cloneStyleFrom(sourceCell.getCellStyle()); - styleMap.put(stHashCode, targetCellStyle); - } - - targetCell.setCellStyle(targetCellStyle); - } - } - - //处理单元格内容 - switch (sourceCell.getCellType()) { - case HSSFCell.CELL_TYPE_STRING: - targetCell.setCellValue(sourceCell.getRichStringCellValue()); - break; - case HSSFCell.CELL_TYPE_NUMERIC: - targetCell.setCellValue(sourceCell.getNumericCellValue()); - break; - case HSSFCell.CELL_TYPE_BLANK: - targetCell.setCellType(HSSFCell.CELL_TYPE_BLANK); - break; - case HSSFCell.CELL_TYPE_BOOLEAN: - targetCell.setCellValue(sourceCell.getBooleanCellValue()); - break; - case HSSFCell.CELL_TYPE_ERROR: - targetCell.setCellErrorValue(sourceCell.getErrorCellValue()); - break; - case HSSFCell.CELL_TYPE_FORMULA: - targetCell.setCellFormula(sourceCell.getCellFormula()); - break; - default: - break; - } - } - - /** - * 功能:拷贝comment - * @param targetCell - * @param sourceCell - * @param targetPatriarch - */ - public static void copyComment(SXSSFCell targetCell,XSSFCell sourceCell,Drawing targetPatriarch)throws Exception{ - if(targetCell == null || sourceCell == null || targetPatriarch == null){ - throw new IllegalArgumentException("调用PoiUtil.copyCommentr()方法时,targetCell、sourceCell、targetPatriarch都不能为空,故抛出该异常!"); - } - - //处理单元格注释 - Comment comment = sourceCell.getCellComment(); - if(comment != null){ - Comment newComment = targetPatriarch.createCellComment(new XSSFClientAnchor()); - newComment.setAuthor(comment.getAuthor()); - newComment.setColumn(comment.getColumn()); - newComment.setRow(comment.getRow()); - newComment.setString(comment.getString()); - newComment.setVisible(comment.isVisible()); - - targetCell.setCellComment(newComment); - } - } - - /** - * 功能:复制原有sheet的合并单元格到新创建的sheet - * - * @param sourceSheet - */ - public static void mergerRegion(SXSSFSheet targetSheet, XSSFSheet sourceSheet)throws Exception { - if(targetSheet == null || sourceSheet == null){ - throw new IllegalArgumentException("调用PoiUtil.mergerRegion()方法时,targetSheet或者sourceSheet不能为空,故抛出该异常!"); - } - - for (int i = 0; i < sourceSheet.getNumMergedRegions(); i++) { - CellRangeAddress oldRange = sourceSheet.getMergedRegion(i); - CellRangeAddress newRange = new CellRangeAddress( - oldRange.getFirstRow(), oldRange.getLastRow(), - oldRange.getFirstColumn(), oldRange.getLastColumn()); - targetSheet.addMergedRegion(newRange); - } - } - -} diff --git a/SpringBootDemo/src/main/resources/application.yml b/SpringBootDemo/src/main/resources/application.yml index b1fe622..167b873 100644 --- a/SpringBootDemo/src/main/resources/application.yml +++ b/SpringBootDemo/src/main/resources/application.yml @@ -1,52 +1,39 @@ -#服务启动端口 -server : - port : 8080 - -#数据库配置 -spring: - datasource: - name: test - url: jdbc:mysql://192.168.2.5:3335/test_data?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&allowMultiQueries=true&useSSL=false&zeroDateTimeBehavior=convertToNull - username: root - password: chifaner159 - # 使用druid数据源 - type: com.alibaba.druid.pool.DruidDataSource - driver-class-name: com.mysql.jdbc.Driver - filters: stat - maxActive: 20 - initialSize: 1 - maxWait: 60000 - minIdle: 1 - timeBetweenEvictionRunsMillis: 60000 - minEvictableIdleTimeMillis: 300000 - validationQuery: select 'x' - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - poolPreparedStatements: true - maxOpenPreparedStatements: 20 - redis: - host: 192.168.2.5 - #redis密码,没有密码的可以用~表示 - password: ~ - port: 6381 - pool: - max-active: 100 - max-idle: 10 - max-wait: 100000 -mybatis: - type-aliases-package: com.xiaour.spring.boot.mapper - mapper-locations: classpath:mapper/*.xml - configLocation: classpath:mybatis-config.xml - -# 日志输出 -logging: - file: D:/boot.log - level: - com.ibatis:DEBUG - root:DEBUG - -task: - cron:0 0/5 * * * ? - - +#服务启动端口 +server : + port : 8080 + +#数据库配置 +spring: + datasource: + url: jdbc:mysql://127.0.0.1:9966/study?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&useSSL=false&verifyServerCertificate=false + username: your.account + password: your.pass + # 使用druid数据源 + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + redis: + host: 127.0.0.1 + #redis密码,没有密码的可以用~表示 + password: ~ + port: 6379 + pool: + max-active: 100 + max-idle: 10 + max-wait: 100000 +# Mybatis mapper 映射路径配置 +mybatis: + type-aliases-package: com.xiaour.spring.boot.mapper + mapper-locations: classpath*:mapper/*.xml + configLocation: classpath:mybatis-config.xml + +# 日志输出 +logging: + file: D:/boot.log + level: + com.ibatis:DEBUG + root:DEBUG + +task: + cron:0 0/5 * * * ? + + diff --git a/SpringBootKafkaDemo/pom.xml b/SpringBootKafkaDemo/pom.xml index 60448e6..9681f7a 100644 --- a/SpringBootKafkaDemo/pom.xml +++ b/SpringBootKafkaDemo/pom.xml @@ -50,8 +50,13 @@ spring-boot-starter-web RELEASE + + org.springframework + spring-context + 5.1.3.RELEASE + - + diff --git a/SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/KafkaApplication.class b/SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/KafkaApplication.class index 2c3c15f6604e771027d7e7fc2dd7f0cc91f6c766..39bc9dcfec1ba010c8d3156bc4384d1a706ce694 100644 GIT binary patch delta 105 zcmcb``h!*K)W2Q(7#J8#7-YE^SQtdv8N|34#2F;m86+o4Z50&oO)bgDPYFmYO3Y0y zNi8a#cy=e76c2+mgUsX}#@~!glRKDf6$F3=urf060VyU1K`<%AAPl707#JBu7#IL$ C=oF#= delta 76 zcmeytdW%)+)W2Q(7#J8#7-YB@SQtdu8AQ1l#2Ccc86+l3ZJqdNJDVgAgA{}GX7euA-rLVLf! zk1@s>ihFKyPjla*Us3P-Z}th~cvP(5Dh^01G8|fDEpkg7k(U${5;sE8_OV6DqO7QJ zA~}^*-@U1b)dZ`aKYo54bo#^oi$C^p8)uq2=aQPH!G-3ME6ufCZZx;t1)HJx zS`$yxq@`)ok=$##JbXNbs*YF)CgGoASg>vmZ<#nGNSa>>F`TOK58U7r%JD|!!bBeFI=0;PZ>`-yIO;}q~)HMqKgof*;L(8G9>Cjd56#egT zBSa9L%ioKEVaS~#Fx>NCc;w0O?3Ne9h;dZ+(q|K14HH7clsCo9Fz0>!=><}F(O2x? cOEP5by%d6+P5uM1BP-bUPVP{aCsPa`%z&EudBR?e| zu_!S&wIsEuc(XWTAtNKxoLP)Sa( hq!fenp~4C0gDGug08Fo-cQPBvh6Wo2ZLWRRNtkx6*+3}$s!X$Bdf_z`ATPDTb Date: Thu, 24 Oct 2019 16:51:14 +0800 Subject: [PATCH 07/26] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/boot/config/MyBatisConfig.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MyBatisConfig.java diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MyBatisConfig.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MyBatisConfig.java new file mode 100644 index 0000000..3e498a6 --- /dev/null +++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MyBatisConfig.java @@ -0,0 +1,43 @@ +package com.xiaour.spring.boot.config; + +import com.alibaba.druid.pool.DruidDataSource; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +/** + * @Date: 2018-12-26 12:05 + * @version: v1.0 + * @Description: mybatis stater从某个版本后去掉了自动配置,需要用config配置 + */ +@Configuration +public class MyBatisConfig { + + @Autowired + private DataSourceProperties dataSourceProperties; + + + @Bean(name = "dataSource") + public DruidDataSource dataSource() { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setUrl(dataSourceProperties.getUrl()); + + dataSource.setDriverClassName(dataSourceProperties.getDriverClassName()); + dataSource.setUsername(dataSourceProperties.getUsername()); + dataSource.setPassword(dataSourceProperties.getPassword()); + + return dataSource; + + } + + @Bean + public SqlSessionFactory sqlSessionFactory() throws Exception { + SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); + sqlSessionFactoryBean.setDataSource(dataSource()); + return sqlSessionFactoryBean.getObject(); + } +} From 36fd4627f5e4462acfaf6127407e316673291241 Mon Sep 17 00:00:00 2001 From: "xiaour.zhang" Date: Thu, 31 Oct 2019 14:46:22 +0800 Subject: [PATCH 08/26] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 07dd19b..686c0df 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,8 @@ ⭐️ SpringBootDemo 本代码集成了SpringBoot+MyBatis+Redis+MySql。 -最新的部分经网友指正已经把冗余的代码去掉了,大家clone到本地后直接转成maven项目应该就可以运行了,项目中使用到的数据库表如下 +最新的部分经网友指正已经把冗余的代码去掉了,代码部分和配置文件部分都有相关的注释; +git clone 到本地后就可以运行了,项目中使用到的数据库表如下 ```sql -- ---------------------------- @@ -43,6 +44,9 @@ Springboot2.0继承了Kafka消息中间件 ⭐️ SpringBootRocketMqDemo Springboot2.0继承了RocketMQ4.3消息中间件 +⭐️ SpringWebfluxDemo +Webflux Spring异步编程。 + --------------------------------- 有兴趣的朋友可以关注一下最新开源的 From 942a4c1e4285fa4d20ad470ec6aa1b4ccfb8e649 Mon Sep 17 00:00:00 2001 From: "xiaour.zhang" Date: Thu, 31 Oct 2019 14:47:42 +0800 Subject: [PATCH 09/26] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 686c0df..c5d94a1 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 4.Webflux Spring异步编程,你将发现新大陆(代码已经部分上传,blog完善中...) -### 代码部分 +## 代码部分 ⭐️ SpringBootDemo 本代码集成了SpringBoot+MyBatis+Redis+MySql。 From 1dd6aa0824d93ee8ea9ebf046969a2793c7069e9 Mon Sep 17 00:00:00 2001 From: "xiaour.zhang" Date: Fri, 29 Nov 2019 14:44:07 +0800 Subject: [PATCH 10/26] Delete maven-wrapper.jar --- .../.mvn/wrapper/maven-wrapper.jar | Bin 47610 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 SpringBootKafkaDemo/.mvn/wrapper/maven-wrapper.jar diff --git a/SpringBootKafkaDemo/.mvn/wrapper/maven-wrapper.jar b/SpringBootKafkaDemo/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 9cc84ea9b4d95453115d0c26488d6a78694e0bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47610 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 From 0b7d1d9b67c2eedf295430b40c70036a88bc6eab Mon Sep 17 00:00:00 2001 From: "xiaour.zhang" Date: Fri, 29 Nov 2019 14:44:16 +0800 Subject: [PATCH 11/26] Delete maven-wrapper.properties --- SpringBootKafkaDemo/.mvn/wrapper/maven-wrapper.properties | 1 - 1 file changed, 1 deletion(-) delete mode 100644 SpringBootKafkaDemo/.mvn/wrapper/maven-wrapper.properties diff --git a/SpringBootKafkaDemo/.mvn/wrapper/maven-wrapper.properties b/SpringBootKafkaDemo/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index b573bb5..0000000 --- a/SpringBootKafkaDemo/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1 +0,0 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip From 33bc1c13a871e111bdfdd458fe6f9e9ec6452d86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Oct 2020 06:43:53 +0000 Subject: [PATCH 12/26] Bump junit from 4.12 to 4.13.1 in /SpringBootDemoV2 Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.1. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.1) Signed-off-by: dependabot[bot] --- SpringBootDemoV2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringBootDemoV2/pom.xml b/SpringBootDemoV2/pom.xml index 62a7b2a..753a362 100644 --- a/SpringBootDemoV2/pom.xml +++ b/SpringBootDemoV2/pom.xml @@ -73,7 +73,7 @@ junit junit - 4.12 + 4.13.1 From 3c910d3f98dda543a4c924c62f5f1d6b2bd28e48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Jan 2021 19:51:10 +0000 Subject: [PATCH 13/26] Bump poi from 3.13 to 3.17 in /SpringBootDemo Bumps poi from 3.13 to 3.17. Signed-off-by: dependabot[bot] --- SpringBootDemo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringBootDemo/pom.xml b/SpringBootDemo/pom.xml index 230a45e..d214501 100644 --- a/SpringBootDemo/pom.xml +++ b/SpringBootDemo/pom.xml @@ -116,7 +116,7 @@ org.apache.poi poi - 3.13 + 3.17 org.apache.poi From 7e7ece10fdf57a0aafcc8d89447dd67b23fb5ee1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Apr 2021 18:00:31 +0000 Subject: [PATCH 14/26] Bump commons-io from 2.5 to 2.7 in /SpringBootDemo Bumps commons-io from 2.5 to 2.7. Signed-off-by: dependabot[bot] --- SpringBootDemo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringBootDemo/pom.xml b/SpringBootDemo/pom.xml index 230a45e..acb456d 100644 --- a/SpringBootDemo/pom.xml +++ b/SpringBootDemo/pom.xml @@ -99,7 +99,7 @@ commons-io commons-io - 2.5 + 2.7 From e27b2fe67cfa1faa91c3ea50685010378836005d Mon Sep 17 00:00:00 2001 From: jerryoung Date: Sun, 5 Dec 2021 22:15:56 +0800 Subject: [PATCH 15/26] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8DInvalid=20bound=20s?= =?UTF-8?q?tatement=20(not=20found)=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xiaour/spring/boot/config/MyBatisConfig.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MyBatisConfig.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MyBatisConfig.java index 3e498a6..5b1f78d 100644 --- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MyBatisConfig.java +++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MyBatisConfig.java @@ -7,6 +7,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; /** @@ -38,6 +39,8 @@ public DruidDataSource dataSource() { public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource()); + sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() + .getResources(("classpath*:mapper/*.xml"))); return sqlSessionFactoryBean.getObject(); } } From 6b17d8b7e585de0edb1cb51151f94bb8c592ef1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Mar 2022 18:39:54 +0000 Subject: [PATCH 16/26] Bump spring-boot-starter-web in /SpringBootKafkaDemo Bumps [spring-boot-starter-web](https://github.com/spring-projects/spring-boot) from RELEASE to 2.5.12. - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/commits/v2.5.12) --- updated-dependencies: - dependency-name: org.springframework.boot:spring-boot-starter-web dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- SpringBootKafkaDemo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringBootKafkaDemo/pom.xml b/SpringBootKafkaDemo/pom.xml index 9681f7a..9831ec0 100644 --- a/SpringBootKafkaDemo/pom.xml +++ b/SpringBootKafkaDemo/pom.xml @@ -48,7 +48,7 @@ org.springframework.boot spring-boot-starter-web - RELEASE + 2.5.12 org.springframework From 6ba5f1f1790b2dae147ea1ea0e54b707371aff8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Mar 2022 18:41:26 +0000 Subject: [PATCH 17/26] Bump spring-boot-starter-web in /SpringBootRocketMqDemo Bumps [spring-boot-starter-web](https://github.com/spring-projects/spring-boot) from RELEASE to 2.5.12. - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/commits/v2.5.12) --- updated-dependencies: - dependency-name: org.springframework.boot:spring-boot-starter-web dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- SpringBootRocketMqDemo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringBootRocketMqDemo/pom.xml b/SpringBootRocketMqDemo/pom.xml index e8cee00..e3cf92d 100644 --- a/SpringBootRocketMqDemo/pom.xml +++ b/SpringBootRocketMqDemo/pom.xml @@ -45,7 +45,7 @@ org.springframework.boot spring-boot-starter-web - RELEASE + 2.5.12 From 566547620588000ff7917a94ea5c70da07a276a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 20:49:52 +0000 Subject: [PATCH 18/26] Bump gson from 2.8.2 to 2.8.9 in /SpringBootKafkaDemo Bumps [gson](https://github.com/google/gson) from 2.8.2 to 2.8.9. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.8.2...gson-parent-2.8.9) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- SpringBootKafkaDemo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringBootKafkaDemo/pom.xml b/SpringBootKafkaDemo/pom.xml index 9831ec0..d58c85e 100644 --- a/SpringBootKafkaDemo/pom.xml +++ b/SpringBootKafkaDemo/pom.xml @@ -43,7 +43,7 @@ com.google.code.gson gson - 2.8.2 + 2.8.9 org.springframework.boot From d1a27243307ce66496056d7fc1772516f1e54526 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 May 2022 20:50:32 +0000 Subject: [PATCH 19/26] Bump gson from 2.8.2 to 2.8.9 in /SpringBootDemoV2 Bumps [gson](https://github.com/google/gson) from 2.8.2 to 2.8.9. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.8.2...gson-parent-2.8.9) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- SpringBootDemoV2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringBootDemoV2/pom.xml b/SpringBootDemoV2/pom.xml index 753a362..4292c6f 100644 --- a/SpringBootDemoV2/pom.xml +++ b/SpringBootDemoV2/pom.xml @@ -56,7 +56,7 @@ com.google.code.gson gson - 2.8.2 + 2.8.9 From 90f921e26b17d81bfe9f45d8889c2fb83202e8bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Jun 2022 01:56:21 +0000 Subject: [PATCH 20/26] Bump fastjson from 1.2.31 to 1.2.83 in /SpringBootDemo Bumps [fastjson](https://github.com/alibaba/fastjson) from 1.2.31 to 1.2.83. - [Release notes](https://github.com/alibaba/fastjson/releases) - [Commits](https://github.com/alibaba/fastjson/compare/1.2.31...1.2.83) --- updated-dependencies: - dependency-name: com.alibaba:fastjson dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- SpringBootDemo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringBootDemo/pom.xml b/SpringBootDemo/pom.xml index 94ff1d4..b45311e 100644 --- a/SpringBootDemo/pom.xml +++ b/SpringBootDemo/pom.xml @@ -93,7 +93,7 @@ com.alibaba fastjson - 1.2.31 + 1.2.83 From cbfb987b400aa1e2e6b73fb73913de0e757c2080 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jun 2022 16:46:21 +0000 Subject: [PATCH 21/26] Bump poi from 3.17 to 4.1.1 in /SpringBootDemo Bumps poi from 3.17 to 4.1.1. --- updated-dependencies: - dependency-name: org.apache.poi:poi dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- SpringBootDemo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringBootDemo/pom.xml b/SpringBootDemo/pom.xml index 94ff1d4..ef7e569 100644 --- a/SpringBootDemo/pom.xml +++ b/SpringBootDemo/pom.xml @@ -116,7 +116,7 @@ org.apache.poi poi - 3.17 + 4.1.1 org.apache.poi From e77ed36cea1d8138f0c5dd76ad49c5a70d4c4632 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 20:56:37 +0000 Subject: [PATCH 22/26] Bump org.apache.zookeeper:zookeeper in /SpringBootDemoV2 Bumps org.apache.zookeeper:zookeeper from 3.4.11 to 3.7.2. --- updated-dependencies: - dependency-name: org.apache.zookeeper:zookeeper dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- SpringBootDemoV2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringBootDemoV2/pom.xml b/SpringBootDemoV2/pom.xml index 4292c6f..a8d66cd 100644 --- a/SpringBootDemoV2/pom.xml +++ b/SpringBootDemoV2/pom.xml @@ -43,7 +43,7 @@ org.apache.zookeeper zookeeper - 3.4.11 + 3.7.2 From ae4fc1d0b524690f81f45c3a245e4b9e90880804 Mon Sep 17 00:00:00 2001 From: "Zhang.Tao" Date: Mon, 20 Nov 2023 13:52:22 +0800 Subject: [PATCH 23/26] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c5d94a1..ae7616d 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ 4.Webflux Spring异步编程,你将发现新大陆(代码已经部分上传,blog完善中...) +5.[利用EasyExcel,两行代码开发一个和API结果一致的生成Excel功能](https://github.com/xiaour/EasyExport#readme) + ## 代码部分 ⭐️ SpringBootDemo From 54fc5c0da0075f4ba0fa17db17daad9ac17cfe41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Feb 2024 22:48:42 +0000 Subject: [PATCH 24/26] Bump org.springframework:spring-context in /SpringBootKafkaDemo Bumps [org.springframework:spring-context](https://github.com/spring-projects/spring-framework) from 5.1.3.RELEASE to 5.2.22.RELEASE. - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.1.3.RELEASE...v5.2.22.RELEASE) --- updated-dependencies: - dependency-name: org.springframework:spring-context dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- SpringBootKafkaDemo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpringBootKafkaDemo/pom.xml b/SpringBootKafkaDemo/pom.xml index d58c85e..60bf559 100644 --- a/SpringBootKafkaDemo/pom.xml +++ b/SpringBootKafkaDemo/pom.xml @@ -53,7 +53,7 @@ org.springframework spring-context - 5.1.3.RELEASE + 5.2.22.RELEASE From 01862bbdd3339113bf71384a063c5adc8bcf05de Mon Sep 17 00:00:00 2001 From: zhangtao Date: Wed, 6 Mar 2024 18:36:27 +0800 Subject: [PATCH 25/26] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B4=E4=BD=93?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBootDemo/pom.xml | 12 +- SpringBootDemoV2/pom.xml | 16 +- .../java/com/github/xiaour/Application.java | 3 +- .../github/xiaour/controller/AuthNotify.java | 147 ------------------ .../github/xiaour/controller/WxCallback.java | 45 ------ SpringBootDemoV3/.gitignore | 33 ++++ SpringBootDemoV3/pom.xml | 64 ++++++++ .../boot/SpringBootDemoV3Application.java | 15 ++ .../spring/boot/controller/CatController.java | 34 ++++ .../com/xiaour/spring/boot/entity/Cat.java | 60 +++++++ .../xiaour/spring/boot/entity/PageIndex.java | 24 +++ .../xiaour/spring/boot/entity/PageInfo.java | 26 ++++ .../spring/boot/service/CatService.java | 44 ++++++ .../src/main/resources/application.properties | 15 ++ .../SpringBootDemoV3ApplicationTests.java | 13 ++ SpringBootKafkaDemo/pom.xml | 4 +- .../target/classes/application.yml | 33 ---- .../spring/boot/kafka/KafkaApplication.class | Bin 760 -> 0 bytes .../spring/boot/kafka/consumer/Consumer.class | Bin 1727 -> 0 bytes .../spring/boot/kafka/producer/Producer.class | Bin 1748 -> 0 bytes .../boot/kafka/producer/SendController.class | Bin 887 -> 0 bytes .../boot/kafka/KafkaApplicationTests.class | Bin 649 -> 0 bytes SpringBootRocketMqDemo/pom.xml | 9 +- SpringWebFluxDemo/pom.xml | 4 +- pom.xml | 27 ++++ 25 files changed, 380 insertions(+), 248 deletions(-) delete mode 100644 SpringBootDemoV2/src/main/java/com/github/xiaour/controller/AuthNotify.java delete mode 100644 SpringBootDemoV2/src/main/java/com/github/xiaour/controller/WxCallback.java create mode 100644 SpringBootDemoV3/.gitignore create mode 100644 SpringBootDemoV3/pom.xml create mode 100644 SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/SpringBootDemoV3Application.java create mode 100644 SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/controller/CatController.java create mode 100644 SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/Cat.java create mode 100644 SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageIndex.java create mode 100644 SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageInfo.java create mode 100644 SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/service/CatService.java create mode 100644 SpringBootDemoV3/src/main/resources/application.properties create mode 100644 SpringBootDemoV3/src/test/java/com/xiaour/spring/boot/SpringBootDemoV3ApplicationTests.java delete mode 100644 SpringBootKafkaDemo/target/classes/application.yml delete mode 100644 SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/KafkaApplication.class delete mode 100644 SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/consumer/Consumer.class delete mode 100644 SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/producer/Producer.class delete mode 100644 SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/producer/SendController.class delete mode 100644 SpringBootKafkaDemo/target/test-classes/com/xiaour/spring/boot/kafka/KafkaApplicationTests.class create mode 100644 pom.xml diff --git a/SpringBootDemo/pom.xml b/SpringBootDemo/pom.xml index 99875aa..3280d80 100644 --- a/SpringBootDemo/pom.xml +++ b/SpringBootDemo/pom.xml @@ -4,14 +4,20 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.tony - com.xiaour.spring.boot - 1.0-SNAPSHOT + com.github.xiaour + springbootv1 + 0.0.1-SNAPSHOT + SpringBootDemo + Demo project for Spring Boot + jar + + org.springframework.boot spring-boot-starter-parent 1.5.2.RELEASE + diff --git a/SpringBootDemoV2/pom.xml b/SpringBootDemoV2/pom.xml index a8d66cd..9c0856a 100644 --- a/SpringBootDemoV2/pom.xml +++ b/SpringBootDemoV2/pom.xml @@ -3,18 +3,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - SpringBootDemoV2 - SpringBootDemoV2 + com.github.xiaour + springbootv2 0.0.1-SNAPSHOT - jar - SpringBootDemoV2 Demo project for Spring Boot V2 + jar + org.springframework.boot spring-boot-starter-parent - 2.0.0.RELEASE + 2.4.2 @@ -29,6 +29,7 @@ org.springframework.boot spring-boot-starter-data-redis + org.springframework.boot spring-boot-starter-web @@ -65,11 +66,6 @@ 1.10 - - dom4j - dom4j - - junit junit diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/Application.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/Application.java index c1e862e..caf30a9 100644 --- a/SpringBootDemoV2/src/main/java/com/github/xiaour/Application.java +++ b/SpringBootDemoV2/src/main/java/com/github/xiaour/Application.java @@ -10,7 +10,8 @@ public class Application { public static void main(String[] args) { - SpringApplication.run(Application.class, args); + //SpringApplication.run(Application.class, args); + } diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/controller/AuthNotify.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/controller/AuthNotify.java deleted file mode 100644 index 11dfee9..0000000 --- a/SpringBootDemoV2/src/main/java/com/github/xiaour/controller/AuthNotify.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.github.xiaour.controller; - -import com.github.xiaour.constants.Api; -import com.github.xiaour.exception.OApiException; -import com.github.xiaour.utils.HttpHelper; -import com.github.xiaour.utils.JsonUtil; -import com.github.xiaour.utils.WXBizMsgCrypt; -import com.github.xiaour.utils.Xml2JsonUtil; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import jdk.nashorn.internal.parser.JSONParser; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; -import java.util.Map; - -/** - * 授权事件接收 - * @Author: Xiaour - * @Description: - * @Date: 2018/3/12 下午5:27 - */ -@RestController -public class AuthNotify { - - - /** - * 这里以后肯定要维护到配置文件或缓存的 - * @param requestBody - * @return - */ - - private static String aesKey="4a5665bf9fbe0618b7154cc9d93342b6a7b2abcf4e8"; - - private static String token="ois3rd"; - - private static String appsecret="a38dd974a9e6490dfbf5b21cd38f9996"; - - private static String component_access_token=""; - - - @RequestMapping("auth_notify") - @PostMapping(produces = "application/xml; charset=UTF-8") - public String payNotify(@RequestBody String requestBody, @RequestParam("timestamp")String timestamp, @RequestParam("nonce")String nonce, - @RequestParam("msg_signature")String msgSignature){ - String appid=null; - Map data= new HashMap<>(); - data.put("timestamp",timestamp); - data.put("nonce",nonce); - data.put("msg_signature",msgSignature); - data.put("requestBody",requestBody); - - System.out.println(data); - - try { - JsonObject jsonData= Xml2JsonUtil.xml2Json(requestBody); - - appid=jsonData.get("AppId").getAsString(); - - WXBizMsgCrypt pc = new WXBizMsgCrypt(token, aesKey,appid); - - String decode=pc.decryptMsg(msgSignature,timestamp,nonce,jsonData.get("Encrypt").getAsString()); - - System.out.println(decode); - - JsonObject decodeJson=Xml2JsonUtil.xml2Json(decode); - - getComponentTtoken(appid,appsecret,decodeJson.get("ComponentVerifyTicket").getAsString()); - - getPreAuthCode(appid); - - } catch (Exception e) { - - e.printStackTrace(); - - } - return "success"; - } - - private String getPreAuthCode(String appid) { - String preAuthCode=null; - - Map postData=new HashMap<>(); - - postData.put("component_appid",appid); - try { - - String jsonStr= HttpHelper.postByRest(Api.create_preauthcode+component_access_token,String.class,null, JsonUtil.getJsonString(postData)); - Map jsonMap= JsonUtil.json2Obj(jsonStr,Map.class); - - preAuthCode=jsonMap.get("pre_auth_code").toString(); - - String guideUrl="https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid="+appid+"&pre_auth_code="+preAuthCode+"&redirect_uri=http://sp.chifaner.com/wx/callback/auth"; - - System.out.println(guideUrl); - - return preAuthCode; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - private void getComponentTtoken(String appid, String appsecret, String componentVerifyTicket){ - - Map postData=new HashMap<>(); - - postData.put("component_appid",appid); - - postData.put("component_appsecret",appsecret); - - postData.put("component_verify_ticket",componentVerifyTicket); - - try { - - String jsonStr= HttpHelper.postByRest(Api.component_token,String.class,null, JsonUtil.getJsonString(postData)); - Map jsonMap= JsonUtil.json2Obj(jsonStr,Map.class); - component_access_token=jsonMap.get("component_access_token").toString(); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void main(String[] args) { - String xml="" + "\n" + - "\n" + ""; - try { - JsonObject jsonData= Xml2JsonUtil.xml2Json(xml); - - WXBizMsgCrypt pc = null; - - pc = new WXBizMsgCrypt(token, aesKey,"wxa797588149020de4"); - - System.out.println(jsonData.get("Encrypt").getAsString()); - - String decode=pc.decryptMsg("d5b4bcef832c27f6f2804d0055cec64864c82a54","1520922592","941622427",jsonData.get("Encrypt").getAsString()); - - JsonObject decodeJson=Xml2JsonUtil.xml2Json(decode); - - System.out.println(decodeJson.get("ComponentVerifyTicket").getAsString()); - } catch (Exception e) { - e.printStackTrace(); - } - } - -} diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/controller/WxCallback.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/controller/WxCallback.java deleted file mode 100644 index 98085fa..0000000 --- a/SpringBootDemoV2/src/main/java/com/github/xiaour/controller/WxCallback.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.github.xiaour.controller; - -import com.github.xiaour.utils.Xml2JsonUtil; -import com.google.gson.JsonObject; -import org.dom4j.DocumentException; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 消息与事件接收 - * @Author: Xiaour - * @Description: - * @Date: 2018/3/12 下午5:25 - */ - -@RestController -public class WxCallback { - - @RequestMapping("callback/auth") - public String callbackAuth(String auth_code,Integer expires_in){ - System.out.println("auth_code:"+auth_code); - System.out.println("expires_in:"+expires_in); - return "success"; - } - - - @RequestMapping("callback/{appid}") - @PostMapping(produces = "application/xml; charset=UTF-8") - public String callbackMsg(@RequestBody String requestBody, @PathVariable String appid){ - System.out.println(appid); - System.out.println(requestBody); - try { - JsonObject jsonData= Xml2JsonUtil.xml2Json(requestBody); - System.out.println(jsonData); - } catch (DocumentException e) { - e.printStackTrace(); - } - return "success"; - } - - -} diff --git a/SpringBootDemoV3/.gitignore b/SpringBootDemoV3/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/SpringBootDemoV3/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/SpringBootDemoV3/pom.xml b/SpringBootDemoV3/pom.xml new file mode 100644 index 0000000..110db5f --- /dev/null +++ b/SpringBootDemoV3/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.3 + + + + com.github.xiaour + springbootv3 + 0.0.1-SNAPSHOT + SpringBootDemoV3 + Demo project for Spring Boot + jar + + + 17 + + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-web + + + + io.github.xiaour + easy-export + 1.0.1-RELEASE + + + + com.alibaba + easyexcel + 2.2.3 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/SpringBootDemoV3Application.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/SpringBootDemoV3Application.java new file mode 100644 index 0000000..7b98f02 --- /dev/null +++ b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/SpringBootDemoV3Application.java @@ -0,0 +1,15 @@ +package com.xiaour.spring.boot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootDemoV3Application { + + public static void main(String[] args) { + SpringApplication.run(SpringBootDemoV3Application.class, args); + //System.out.println(Math.max(10,11)); + } + + +} diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/controller/CatController.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/controller/CatController.java new file mode 100644 index 0000000..d740815 --- /dev/null +++ b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/controller/CatController.java @@ -0,0 +1,34 @@ +package com.xiaour.spring.boot.controller; + +import com.xiaour.spring.boot.entity.PageIndex; +import com.xiaour.spring.boot.entity.PageInfo; +import com.xiaour.spring.boot.service.CatService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/cat") +public class CatController { + + private CatService catService; + + @Autowired + public CatController(CatService catService) { + this.catService = catService; + } + + @GetMapping("list") + public PageInfo getCatList() { + PageIndex index = new PageIndex(); + index.setPageIndex(1); + index.setPageSize(30); + return catService.getCatList(index); + } + + + + + +} diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/Cat.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/Cat.java new file mode 100644 index 0000000..5aef16e --- /dev/null +++ b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/Cat.java @@ -0,0 +1,60 @@ +package com.xiaour.spring.boot.entity; + +import com.alibaba.excel.annotation.ExcelProperty; + +public class Cat { + + /** + * 宠物昵称 + */ + @ExcelProperty(value = "昵称") + private String nickName; + + /** + * 年龄 + */ + @ExcelProperty(value = "年龄") + private Integer age; + + /** + * 品种 + */ + @ExcelProperty(value = "品种") + private String category; + + public Cat() { + } + + public Cat(String nickName, Integer age, String category) { + this.nickName = nickName; + this.age = age; + this.category = category; + } + + public String getNickName() { + return nickName; + } + + public Cat setNickName(String nickName) { + this.nickName = nickName; + return this; + } + + public Integer getAge() { + return age; + } + + public Cat setAge(Integer age) { + this.age = age; + return this; + } + + public String getCategory() { + return category; + } + + public Cat setCategory(String category) { + this.category = category; + return this; + } +} diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageIndex.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageIndex.java new file mode 100644 index 0000000..abaf3dc --- /dev/null +++ b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageIndex.java @@ -0,0 +1,24 @@ +package com.xiaour.spring.boot.entity; + +public class PageIndex { + + private Integer pageIndex; + + private Integer pageSize; + + public Integer getPageIndex() { + return pageIndex; + } + + public void setPageIndex(Integer pageIndex) { + this.pageIndex = pageIndex; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } +} diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageInfo.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageInfo.java new file mode 100644 index 0000000..53fafdd --- /dev/null +++ b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageInfo.java @@ -0,0 +1,26 @@ +package com.xiaour.spring.boot.entity; + +import java.util.List; + +public class PageInfo { + + private List list; + + private Integer total; + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public Integer getTotal() { + return total; + } + + public void setTotal(Integer total) { + this.total = total; + } +} diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/service/CatService.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/service/CatService.java new file mode 100644 index 0000000..ba1b8c1 --- /dev/null +++ b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/service/CatService.java @@ -0,0 +1,44 @@ +package com.xiaour.spring.boot.service; + +import com.github.xiaour.easyexport.annotation.EasyExport; +import com.github.xiaour.easyexport.annotation.EasyExportSingle; +import com.xiaour.spring.boot.entity.Cat; +import com.xiaour.spring.boot.entity.PageIndex; +import com.xiaour.spring.boot.entity.PageInfo; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@EasyExport +@Service +public class CatService { + + /** + * 这里主要是模拟数据和分页参数的一些主要逻辑 + * @param pageIndex 模拟的分页参数,这里面是伪代码,无需实现 + * @return + */ + @EasyExportSingle(value = "小猫明细",modelClass = Cat.class) + public PageInfo getCatList(PageIndex pageIndex){ + + PageInfo page = new PageInfo(); + + List list = new ArrayList<>(); + + //下面提供了两种实体赋值方式,大家可以试试那种更方便 + Cat cat1 = new Cat("咪咪",1,"波斯猫"); + + Cat cat2 = new Cat().setNickName("汤姆").setAge(6).setCategory("金渐层"); + + list.add(cat1); + + list.add(cat2); + + page.setList(list); + + page.setTotal(list.size()); + + return page; + } +} diff --git a/SpringBootDemoV3/src/main/resources/application.properties b/SpringBootDemoV3/src/main/resources/application.properties new file mode 100644 index 0000000..a39567d --- /dev/null +++ b/SpringBootDemoV3/src/main/resources/application.properties @@ -0,0 +1,15 @@ +server.servlet.context-path= /demo3 + +#??easyexport +easyexport.enabled=true +#?????? +#?????????? +easyexport.fetch.page.size=5000 +#???????????????????true??????? +easyexport.file.delete=true +#???????????????????Sheet????sheet???150000 +easyexport.file.sheet.size=15000 +#???? +easyexport.field.page.number=pageIndex +#??????? +easyexport.field.page.size=pageSize \ No newline at end of file diff --git a/SpringBootDemoV3/src/test/java/com/xiaour/spring/boot/SpringBootDemoV3ApplicationTests.java b/SpringBootDemoV3/src/test/java/com/xiaour/spring/boot/SpringBootDemoV3ApplicationTests.java new file mode 100644 index 0000000..bbe9d67 --- /dev/null +++ b/SpringBootDemoV3/src/test/java/com/xiaour/spring/boot/SpringBootDemoV3ApplicationTests.java @@ -0,0 +1,13 @@ +package com.xiaour.spring.boot; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SpringBootDemoV3ApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/SpringBootKafkaDemo/pom.xml b/SpringBootKafkaDemo/pom.xml index 60bf559..b0eb7a0 100644 --- a/SpringBootKafkaDemo/pom.xml +++ b/SpringBootKafkaDemo/pom.xml @@ -3,8 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.xiaour.spring.boot - kafka + com.github.xiaour + KafkaDemo 0.0.1-SNAPSHOT jar diff --git a/SpringBootKafkaDemo/target/classes/application.yml b/SpringBootKafkaDemo/target/classes/application.yml deleted file mode 100644 index 0b19627..0000000 --- a/SpringBootKafkaDemo/target/classes/application.yml +++ /dev/null @@ -1,33 +0,0 @@ -server: - servlet: - context-path: / - port: 8080 -spring: - kafka: - bootstrap-servers: 127.0.0.1:9092 - #生产者的配置,大部分我们可以使用默认的,这里列出几个比较重要的属性 - producer: - #每批次发送消息的数量 - batch-size: 16 - #设置大于0的值将使客户端重新发送任何数据,一旦这些数据发送失败。注意,这些重试与客户端接收到发送错误时的重试没有什么不同。允许重试将潜在的改变数据的顺序,如果这两个消息记录都是发送到同一个partition,则第一个消息失败第二个发送成功,则第二条消息会比第一条消息出现要早。 - retries: 0 - #producer可以用来缓存数据的内存大小。如果数据产生速度大于向broker发送的速度,producer会阻塞或者抛出异常,以“block.on.buffer.full”来表明。这项设置将和producer能够使用的总内存相关,但并不是一个硬性的限制,因为不是producer使用的所有内存都是用于缓存。一些额外的内存会用于压缩(如果引入压缩机制),同样还有一些用于维护请求。 - buffer-memory: 33554432 - #key序列化方式 - key-serializer: org.apache.kafka.common.serialization.StringSerializer - value-serializer: org.apache.kafka.common.serialization.StringSerializer - #消费者的配置 - consumer: - #Kafka中没有初始偏移或如果当前偏移在服务器上不再存在时,默认区最新 ,有三个选项 【latest, earliest, none】 - auto-offset-reset: latest - #是否开启自动提交 - enable-auto-commit: true - #自动提交的时间间隔 - auto-commit-interval: 100 - #key的解码方式 - key-deserializer: org.apache.kafka.common.serialization.StringDeserializer - #value的解码方式 - value-deserializer: org.apache.kafka.common.serialization.StringDeserializer - #在/usr/local/etc/kafka/consumer.properties中有配置 - group-id: test-consumer-group - diff --git a/SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/KafkaApplication.class b/SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/KafkaApplication.class deleted file mode 100644 index 39bc9dcfec1ba010c8d3156bc4384d1a706ce694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmb7CO-~y!5Pc2_8@6eop+NcQfm?_~eL=mXLZXp+>GC0h!hw@_aT1eVJMwxdf2*ff zJ@g0kM^znfA|I9}1$^%@7?Kvup-YTu3xAi6+ryWf?=zM3BpA`}1!A3wU0_1m;TcaI1u` zF>lN_#w?8CHtsn1wgd-rMSN$*yT;rzre4A#zIU+X;6B6XqKu?oVi>N>Y%vs8R9i4i zG-M>!vT$1@&-r#hp2>#td9cM3X}){Tg5H%W!>xv|Lhm=pRhD>ZoXDu-Z7Zd{eZI5L zJzqs>7K+4M=}qbc8^~0Ph~ajnp^}crWA5*Yg9U*Ukxox9+!Ve_+I3T?6N)tD9b4HR zf62Xo6YBc*p76EVKe4F{^Mh~C;M&5Q2MFbcMaZ-ay!BX174d*Dru!**6(7)YXJE|5 zYITWr{O}B*MH?A!Y3}bgd2E??@POfbQ|MjQ-rxxjg%$}lVyq=Q5!YElwA>w>SX+f5 z_tIt-X&H(wnM&&R!zfakoBt+^1^aV(mv;>GuPWK^HI5%9dQVO38@9E5L4IN@mD4G`RVS4^Cew{Xq{OGa z2Yx2o5i~#cC#_dRe@Fq9QD7?HS}JdYsMJKL;GyXm? zz6E<@!xzbpTIU4HG!?V|7+_h=Yd`yHcy z!Fll(#mTWQN|f?J7j75hCjzy@fPpW-z+a{UK;T7!oFKR|E}=%=ReWkos#0DV^W?ou zB~Ssq;>_%0d_qMQaUWMGdkCLVe455Q_W5D#D*3LFw+QwxRvmnSFX?N9(FVX*^bX-V bZqRs+mQ?7S`2{RRmHantbk;@4Hdv2e5&b_yL|NiICzW`i=Yhx0N7Cx|1F!P5t z2C-PgM`pfe<6~Smt53{u!}xq^<1BEB&5vW?qVv9XFT zEv(rn8=o@PE!?rN!7y^*?jN{2B5Vh)77PnDsaia4D?e)OD>oF+q&nc46ZfPNe5=>L z%5d>P5@|madw%RU0Mh?ElBL|o920>{NYX?^_W#JnK-{P@_?;OnFdxpt=#mz}Lc!D3O zA74+?aqbw-oQS&Dcq%+iz2dgpS=r_*wUe(M$<>)xwsHbgsvfNRA!R;fIO`=!QO?`lRWN%5IZTk-af{(JE$Wm5L!04T9-&*Xs<}hs{i;D2T5e`{ak`gRC%1jFM^Uf- zpC^RjaW8IOm7bz>BlSbg6nHYqtHNtOl_@e;eJ#<65+()>jjD_PNlF@oSu6DC&fsLQF0k0moq8O z&i;W?>D+G^pG$E*#l*vt_?L(QNKBE0Op%m1l5(A7tdj`CX`&N1=R|)Jm?a;2m2kDo jZaVV;MvqXYh!;{^{2k*a2J6vSCa-zgD`26UE)Ki|Bw@+> diff --git a/SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/producer/SendController.class b/SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/producer/SendController.class deleted file mode 100644 index a532e7e3319f6aa05bb30776589b00b8f012ee0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 887 zcmb7CO>Yx15Pja}tILv>v<1pnX}GjK)IC(F0)$jm;A!@k2h$`-cxQlxYY}9eTj!lNf z(3-4FrDfQQQ#0W2l`y5{#n38!!V_a0?~7hv@bf_aYN~k5uzp->rv|dC3YFyYP;29a zQ$`mI2eGjy(>y&Z26ALYNCYI>* zp%j2+TqC6AzzQYt;sav-E!_Ev;2RcNmCwWi($O6uuto;1U&<0rvv@;I(yr3C_6Dq= Ur~o&{>YHP`E#m9MFCuRJ0m=j8R{#J2 diff --git a/SpringBootKafkaDemo/target/test-classes/com/xiaour/spring/boot/kafka/KafkaApplicationTests.class b/SpringBootKafkaDemo/target/test-classes/com/xiaour/spring/boot/kafka/KafkaApplicationTests.class deleted file mode 100644 index 3c908bf2dc5cd5d2205063b17dd03be23f834af0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 649 zcmb7BO-~y!5Pc5$Xwx(S+JfN5je=B5Rn!Xz2`cr{6-W@JXJ;{qlU+OVdMSUar%D|7 z0sT>^Z=D=Ml}q<9v-9!Zn;HLketZJZ$8H-Nc;CW@7Ip-hr^cFaCa`h%aVSv#>Tb0_ zFELhMmib8gff{AZY$q;N*-&{?#mi(pOiUrrPg0l52cul+Wij{0j^)U?AZO}srsVg^ zp3mo*NmVe;4s;QU6M;_ZY|sxOaq5;Vd)K86Cf7q#7)qR5>q6{jZ8LFxET<($l@*-m z_6^li{moRW2vv(lqW>R+8aMY+4L|=T)wMIzN+vT5>t& zLcT9=;(}x#5ee1< 4.0.0 - com.xiaour.spring.boot - rocketmq + com.github.xiaour + rocketmqDemo 0.0.1-SNAPSHOT - jar - SpringBootRocketmqDemo - Demo project for Spring Boot + Demo project for RocketMQ + jar org.springframework.boot diff --git a/SpringWebFluxDemo/pom.xml b/SpringWebFluxDemo/pom.xml index a1aa877..f98a09c 100644 --- a/SpringWebFluxDemo/pom.xml +++ b/SpringWebFluxDemo/pom.xml @@ -9,10 +9,10 @@ com.github.xiaour - flux + fluxDemo 0.0.1-SNAPSHOT SpringWebFluxDemo - Demo project for Spring Boot + Demo project for Web Flux 1.8 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..028c717 --- /dev/null +++ b/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + com.github.xiaour + com.xiaour.spring.boot + 0.0.1-SNAPSHOT + SpringBootDemo + SpringBoot set demo + pom + + + SpringBootDemo + SpringBootDemoV2 + SpringBootDemoV3 + SpringBootKafkaDemo + SpringBootRocketMqDemo + SpringWebFluxDemo + + + + + 17 + + + From 155c426b33fc9553d5a8d50201247a1ceddc1712 Mon Sep 17 00:00:00 2001 From: zhangtao Date: Thu, 7 Mar 2024 14:13:34 +0800 Subject: [PATCH 26/26] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B4=E4=BD=93?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBootDemo/com.tony.spring.boot.iml | 122 ------------------------ 1 file changed, 122 deletions(-) delete mode 100644 SpringBootDemo/com.tony.spring.boot.iml diff --git a/SpringBootDemo/com.tony.spring.boot.iml b/SpringBootDemo/com.tony.spring.boot.iml deleted file mode 100644 index d5354ea..0000000 --- a/SpringBootDemo/com.tony.spring.boot.iml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file