JSONRPC之简化、封装(一)
目录
- 使用类名作为路径
- 路径、参数限制
- 自动配置
- 打成jar包放在本地maven仓库,并使用
引言:
本文章将对JSONRPC进行简单封装、所以需要对JSONRPC有所了解。
如果对JSONRPC不了解的话可以参考一下官网: JSONRPC官网
由于JSONRPC对路径参数的要求比较高,所以就对其进行简单的封装。
写的不足之处请见谅!
准备工作:
- 进入JSONRPC源代码 --》 GitHub地址 Fork到自己账户下
- 然后在本地创建文件夹 使用git clone拉取项目到本地
- 没装Git的可以直接点击下载压缩包
- 下载完之后然后在idea中打开
可以看到他是用Gradle管理的,而我却想用maven来管理,然后把项目打成jar包
这个确实也不难实现,只要懂得Gradle管理项目的原理就可以了,它跟maven实际上差不多,Maven是在pom.xml中通过依赖来管理项目,Gradle是在build.gradle文件中添加依赖来管理的。
所以现在要改就很简单了。
新建一个maven项目,取名jsonrpc4j。我是在写项目的时候改的,所以我就新建了一个Module
然后在pom.xml添加以下依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Financial</artifactId>
<groupId>com.kt</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.kt</groupId>
<artifactId>jsonrpc4j</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<jacksonVersion>2.8.5</jacksonVersion>
<springVersion>4.3.5.RELEASE</springVersion>
<springBotVersion>1.4.3.RELEASE</springBotVersion>
<jettyVersion>9.4.0.RC3</jettyVersion>
<slf4jVersion>1.7.22</slf4jVersion>
</properties>
<dependencies>
<dependency>
<groupId>net.iharder</groupId>
<artifactId>base64</artifactId>
<version>2.3.9</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4jVersion}</version>
</dependency>
<dependency>
<groupId>javax.portlet</groupId>
<artifactId>portlet-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore-nio</artifactId>
<version>4.4.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jacksonVersion}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jacksonVersion}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jacksonVersion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${springBotVersion}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${springBotVersion}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jettyVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${jettyVersion}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.7</version>
<!--<scope>runtime</scope>-->
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
<!--<scope>runtime</scope>-->
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging-api</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</pluginManagement>
</build>
</project>
然后把JSONRPC中src下代码复制过来
接下来就可以开始简单封装这个框架了。
简化、封装
(1)使用类路径作为jsonrpc映射地址
首先改JsonRpcService注解,因为它默认value必填
1. 打开JonRpcService 把value默认赋值为空
2.打开 AutoJsonRpcServiceImplExporter.java 添加一个获取接口名的方法
private static String getRpcInterfaceName(DefaultListableBeanFactory defaultListableBeanFactory, String serviceBeanName) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(JsonServiceExporter.class).addPropertyReference("service", serviceBeanName);
BeanDefinition serviceBeanDefinition = findBeanDefinition(defaultListableBeanFactory, serviceBeanName);
for (Class<?> currentInterface : getBeanInterfaces(serviceBeanDefinition, defaultListableBeanFactory.getBeanClassLoader())) {
if (currentInterface.isAnnotationPresent(JsonRpcService.class)) {
return currentInterface.getName();
}
}
return null;
}
然后把进入findServiceBeanDefinitions() 方法把地址path.add改为
paths.add(getRpcInterfaceName((DefaultListableBeanFactory) beanFactory,beanName));
然后把findBeanDefinition和getBeanInterfaces方法改为静态方法否则无法调用
这样就实现了把类名作为路径了。具体实现原理就不做解释,感兴趣的大佬可以自行debug进去看源代码。
待更!。。。