From 04e11246ced04c3e00ff4fc6edb165f2c96a554a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E6=B3=BD=E9=94=8B?= <282245889@qq.com> Date: Fri, 17 Jul 2020 10:58:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8F=82=E6=95=B0=E5=85=A5?= =?UTF-8?q?=E5=8F=82=E7=9A=84=E6=B3=A8=E8=A7=A3=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 ++++++++++++++--- vue-example/netty-websocket-vue-back/pom.xml | 2 +- .../demo/vue/controller/UserController.java | 12 ++++++++++++ .../src/components/HelloWorld.vue | 5 +++++ websocket-spring-boot-core/pom.xml | 10 ++-------- .../annotation/WebSocketRequestParam.java | 18 ++++++++++++++++++ .../websocket/beans/NettyMethodDefinition.java | 13 +++++++++++++ .../WebSocketControllerBeanFactory.java | 16 ++++++++++++++++ .../server/channel/WebSocketHandler.java | 7 ++++++- ...ebsocketSpringBootCoreApplicationTests.java | 3 ++- websocket-spring-boot-starter/pom.xml | 12 +++--------- ...ocketSpringBootStarterApplicationTests.java | 3 ++- .../demo/controller/DemoController.java | 11 ++++++++++- .../demo/security/WebsocketSecurityImpl.java | 2 +- 14 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/annotation/WebSocketRequestParam.java diff --git a/README.md b/README.md index c748ded..7305846 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ websocket-spring-boot-starter [![License](http://img.shields.io/:license-apache- ### 要求 - jdk版本为1.8或1.8+ -- spring-boot版本为2.3.1.RELEASE +- spring-boot版本为2.0.1.RELEASE+ - netty版本为4.1.42.Final ### example例子 @@ -19,7 +19,7 @@ websocket-spring-boot-starter [![License](http://img.shields.io/:license-apache- com.github.lazyboyl websocket-spring-boot-starter - 0.0.1-SNAPSHOT + 1.0.1.RELEASE ``` @@ -47,6 +47,12 @@ public class VueDemoApplication { @WebSocketController @WebSocketRequestMapping("/user/") public class UserController { + + /** + * 这个userService就是我们平时在spring里面写的service + */ + @Autowired + private UserService userService; /** * 功能描述: 模拟字段请求的方式来实现根据用户ID来获取用户数据 @@ -225,4 +231,9 @@ websocket: thread: boss: 12 work: 12 -``` \ No newline at end of file +``` +--- +### 版本更新 +#### 1.0.1.RELEASE +- `@WebSocketController`注解的类支持构造方法的方式注入的支持。 +- 新增`@WebSocketRequestParam`支持入参的自定义。 diff --git a/vue-example/netty-websocket-vue-back/pom.xml b/vue-example/netty-websocket-vue-back/pom.xml index c3cc13b..0c0214a 100644 --- a/vue-example/netty-websocket-vue-back/pom.xml +++ b/vue-example/netty-websocket-vue-back/pom.xml @@ -23,7 +23,7 @@ com.github.lazyboyl websocket-spring-boot-starter - 0.0.3-SNAPSHOT + 1.0.1.RELEASE diff --git a/vue-example/netty-websocket-vue-back/src/main/java/com/vue/demo/vue/controller/UserController.java b/vue-example/netty-websocket-vue-back/src/main/java/com/vue/demo/vue/controller/UserController.java index 06940be..5d1221b 100644 --- a/vue-example/netty-websocket-vue-back/src/main/java/com/vue/demo/vue/controller/UserController.java +++ b/vue-example/netty-websocket-vue-back/src/main/java/com/vue/demo/vue/controller/UserController.java @@ -2,6 +2,7 @@ import com.github.lazyboyl.websocket.annotation.WebSocketController; import com.github.lazyboyl.websocket.annotation.WebSocketRequestMapping; +import com.github.lazyboyl.websocket.annotation.WebSocketRequestParam; import com.vue.demo.vue.entity.OrgVo; import com.vue.demo.vue.entity.UserVo; import com.vue.demo.vue.service.UserService; @@ -22,6 +23,17 @@ public class UserController { @Autowired private UserService userService; + /** + * 功能描述: 模拟字段请求且使用别名的方式来实现根据用户ID来获取用户数据 + * + * @param userId 用户的流水ID + * @return + */ + @WebSocketRequestMapping("getUserVoByUserIdRename") + public UserVo getUserVoByUserIdRename(@WebSocketRequestParam(name = "uId") String userId) { + return userService.getUserVoByUserId(userId); + } + /** * 功能描述: 模拟实体请求的方式来实现根据用户ID来获取用户数据 * diff --git a/vue-example/netty-websocket-vue-front/src/components/HelloWorld.vue b/vue-example/netty-websocket-vue-front/src/components/HelloWorld.vue index f6b078c..ee98272 100644 --- a/vue-example/netty-websocket-vue-front/src/components/HelloWorld.vue +++ b/vue-example/netty-websocket-vue-front/src/components/HelloWorld.vue @@ -6,6 +6,7 @@ + @@ -23,6 +24,10 @@ export default { this.initWebSocket() }, methods: { + getUserVoByUserIdRename () { + let actions = {'url': '/user/getUserVoByUserIdRename/', 'params': {'uId': 'abc'}} + this.websocketsend(JSON.stringify(actions)) + }, getOrgVo () { let actions = {'url': '/org/getOrgVo/', 'params': {'orgId': 'sada11d', 'orgName': '林泽锋'}} this.websocketsend(JSON.stringify(actions)) diff --git a/websocket-spring-boot-core/pom.xml b/websocket-spring-boot-core/pom.xml index 8654497..5b7145f 100644 --- a/websocket-spring-boot-core/pom.xml +++ b/websocket-spring-boot-core/pom.xml @@ -56,20 +56,14 @@ org.springframework.boot spring-boot-starter - 2.3.1.RELEASE + 2.0.1.RELEASE org.springframework.boot spring-boot-starter-test - 2.3.1.RELEASE + 2.0.1.RELEASE test - - - org.junit.vintage - junit-vintage-engine - - diff --git a/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/annotation/WebSocketRequestParam.java b/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/annotation/WebSocketRequestParam.java new file mode 100644 index 0000000..7481d97 --- /dev/null +++ b/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/annotation/WebSocketRequestParam.java @@ -0,0 +1,18 @@ +package com.github.lazyboyl.websocket.annotation; + +import java.lang.annotation.*; + +/** + * 类描述:请求参数的别名的在定义的注解 + * + * @author linzef + * @since 2020-07-17 + */ +@Target({ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface WebSocketRequestParam { + + String name() default ""; + +} diff --git a/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/beans/NettyMethodDefinition.java b/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/beans/NettyMethodDefinition.java index 2ec165b..1c76b82 100644 --- a/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/beans/NettyMethodDefinition.java +++ b/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/beans/NettyMethodDefinition.java @@ -59,6 +59,19 @@ public class NettyMethodDefinition { */ private String beanName; + /** + * WebSocketRequestParam定义的别名 + */ + private String [] requestParamName; + + public String[] getRequestParamName() { + return requestParamName; + } + + public void setRequestParamName(String[] requestParamName) { + this.requestParamName = requestParamName; + } + public Parameter[] getParameters() { return parameters; } diff --git a/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/factory/WebSocketControllerBeanFactory.java b/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/factory/WebSocketControllerBeanFactory.java index 410154c..61228b8 100644 --- a/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/factory/WebSocketControllerBeanFactory.java +++ b/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/factory/WebSocketControllerBeanFactory.java @@ -1,6 +1,7 @@ package com.github.lazyboyl.websocket.factory; import com.github.lazyboyl.websocket.annotation.WebSocketRequestMapping; +import com.github.lazyboyl.websocket.annotation.WebSocketRequestParam; import com.github.lazyboyl.websocket.beans.NettyBeanDefinition; import com.github.lazyboyl.websocket.beans.NettyMethodDefinition; import org.springframework.core.env.Environment; @@ -95,6 +96,21 @@ protected void registerNettyMethodDefinition(Class c, NettyBeanDefinition nettyB nettyMethodDefinition.setMethodName(m.getName()); nettyMethodDefinition.setBeanName(c.getName()); nettyMethodDefinition.setParameters(m.getParameters()); + Annotation[][] parameterAnnotations = m.getParameterAnnotations(); + String[] requestParamName = new String[parameterAnnotations.length]; + for (int i = 0; i < parameterAnnotations.length; i++) { + if (parameterAnnotations[i].length == 0) { + requestParamName[i] = ""; + } else { + for (int j = 0; j < parameterAnnotations[i].length; j++) { + if(parameterAnnotations[i][j] instanceof WebSocketRequestParam){ + WebSocketRequestParam wsrp = (WebSocketRequestParam) parameterAnnotations[i][j]; + requestParamName[i] = wsrp.name(); + } + } + } + } + nettyMethodDefinition.setRequestParamName(requestParamName); methodMap.put(c.getName() + "." + m.getName(), nettyMethodDefinition); WebSocketRequestMapping a = m.getAnnotation(WebSocketRequestMapping.class); if (a == null) { diff --git a/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/server/channel/WebSocketHandler.java b/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/server/channel/WebSocketHandler.java index df5aa94..b145384 100644 --- a/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/server/channel/WebSocketHandler.java +++ b/websocket-spring-boot-core/src/main/java/com/github/lazyboyl/websocket/server/channel/WebSocketHandler.java @@ -209,6 +209,7 @@ protected void invokeMethod(ChannelHandlerContext ctx, NettyMethodDefinition net Parameter[] ps = nettyMethodDefinition.getParameters(); Object[] obj = new Object[ps.length]; Class[] parameterTypesClass = nettyMethodDefinition.getParameterTypesClass(); + String [] requestParamName = nettyMethodDefinition.getRequestParamName(); for (int i = 0; i < ps.length; i++) { Parameter p = ps[i]; if (isMyClass(parameterTypesClass[i])) { @@ -219,7 +220,11 @@ protected void invokeMethod(ChannelHandlerContext ctx, NettyMethodDefinition net } else if ("java.util.".indexOf(parameterTypesClass[i].getName()) != -1) { SocketUtil.writeAndFlush(ctx.channel(), new SocketResponse(HttpResponseStatus.BAD_REQUEST.code(), "java.util系列暂时只支持map和list,其他类型暂不支持。")); } else { - obj[i] = paramMap.get(p.getName()); + if("".equals(requestParamName[i])){ + obj[i] = paramMap.get(p.getName()); + } else { + obj[i] = paramMap.get(requestParamName[i]); + } } } else { if (parameterTypesClass[i].getName().equals(HttpHeaders.class.getName())) { diff --git a/websocket-spring-boot-core/src/test/java/com/github/lazyboyl/websocket/WebsocketSpringBootCoreApplicationTests.java b/websocket-spring-boot-core/src/test/java/com/github/lazyboyl/websocket/WebsocketSpringBootCoreApplicationTests.java index 41cdc2e..ba6d638 100644 --- a/websocket-spring-boot-core/src/test/java/com/github/lazyboyl/websocket/WebsocketSpringBootCoreApplicationTests.java +++ b/websocket-spring-boot-core/src/test/java/com/github/lazyboyl/websocket/WebsocketSpringBootCoreApplicationTests.java @@ -1,6 +1,7 @@ package com.github.lazyboyl.websocket; -import org.junit.jupiter.api.Test; + +import org.junit.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest diff --git a/websocket-spring-boot-starter/pom.xml b/websocket-spring-boot-starter/pom.xml index 502ebb0..1f95bfa 100644 --- a/websocket-spring-boot-starter/pom.xml +++ b/websocket-spring-boot-starter/pom.xml @@ -42,26 +42,20 @@ com.github.lazyboyl websocket-spring-boot-core - 1.0.0.RELEASE + 1.0.1.RELEASE org.springframework.boot spring-boot-starter - 2.3.1.RELEASE + 2.0.1.RELEASE org.springframework.boot spring-boot-starter-test - 2.3.1.RELEASE + 2.0.1.RELEASE test - - - org.junit.vintage - junit-vintage-engine - - diff --git a/websocket-spring-boot-starter/src/test/java/com/github/lazyboyl/websocket/WebsocketSpringBootStarterApplicationTests.java b/websocket-spring-boot-starter/src/test/java/com/github/lazyboyl/websocket/WebsocketSpringBootStarterApplicationTests.java index a6309b3..e21a503 100644 --- a/websocket-spring-boot-starter/src/test/java/com/github/lazyboyl/websocket/WebsocketSpringBootStarterApplicationTests.java +++ b/websocket-spring-boot-starter/src/test/java/com/github/lazyboyl/websocket/WebsocketSpringBootStarterApplicationTests.java @@ -1,6 +1,7 @@ package com.github.lazyboyl.websocket; -import org.junit.jupiter.api.Test; + +import org.junit.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest diff --git a/wesocket-demo/src/main/java/com/wesocket/demo/controller/DemoController.java b/wesocket-demo/src/main/java/com/wesocket/demo/controller/DemoController.java index e728430..6b06de6 100644 --- a/wesocket-demo/src/main/java/com/wesocket/demo/controller/DemoController.java +++ b/wesocket-demo/src/main/java/com/wesocket/demo/controller/DemoController.java @@ -2,6 +2,7 @@ import com.github.lazyboyl.websocket.annotation.WebSocketController; import com.github.lazyboyl.websocket.annotation.WebSocketRequestMapping; +import com.github.lazyboyl.websocket.annotation.WebSocketRequestParam; import com.wesocket.demo.entity.OrgVo; import com.wesocket.demo.service.OrgService; import org.springframework.beans.factory.annotation.Autowired; @@ -18,7 +19,7 @@ public class DemoController { private Integer port; @Autowired - public DemoController(OrgService orgService,@Value("${websocket.port}") Integer port) { + public DemoController(OrgService orgService, @Value("${websocket.port}") Integer port) { this.orgService = orgService; this.port = port; } @@ -29,4 +30,12 @@ public OrgVo getOrgVo111(String orgId, String orgName) { return orgService.getOrgByOrgId(orgId); } + + @WebSocketRequestMapping("getOrgVo2222") + public OrgVo getOrgVo2222(@WebSocketRequestParam(name = "oId") String orgId, @WebSocketRequestParam(name = "oName") String orgName) { + System.out.println("获取到的请求数据是:" + orgId + "和" + orgName + ",端口是" + port); + return orgService.getOrgByOrgId(orgId); + } + + } diff --git a/wesocket-demo/src/main/java/com/wesocket/demo/security/WebsocketSecurityImpl.java b/wesocket-demo/src/main/java/com/wesocket/demo/security/WebsocketSecurityImpl.java index b95837c..5412293 100644 --- a/wesocket-demo/src/main/java/com/wesocket/demo/security/WebsocketSecurityImpl.java +++ b/wesocket-demo/src/main/java/com/wesocket/demo/security/WebsocketSecurityImpl.java @@ -27,7 +27,7 @@ public int level() { @Override public Boolean authentication(ChannelHandlerContext ctx, SocketRequest socketRequest) { - if(socketRequest.getUrl().indexOf("getOrgVo111")!=-1){ + if(socketRequest.getUrl().indexOf("getOrgVo111")!=-1 || socketRequest.getUrl().indexOf("getOrgVo2222")!=-1){ return true; } Boolean isPass = authService.authUrl(socketRequest.getUrl());