项目环境
springboot版本:2.7.10
tongweb版本:8.0.E.9
一、安装本地仓库依赖
进入下载好的东方通资料,进入安装工程介质TongWeb8.0.E.9\TongWeb8.0.E.9\安装工程介质,解压自己要用的压缩包,我们要用的是内嵌的容器,所以解压tongweb-embed-8.0.E.9.zip这个压缩包即可。进入解压后的文件夹,执行installMavenJar,把依赖安装到本地的maven仓库中。
二、配置项目的pom.xml
# 排除spring web包中的tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
# 引入springboot对应版本的tongweb依赖,我的springboot是2.7.10,所以用-2.x依赖
# 同时,排除tongweb-servlet-api、tongweb-websocket两个包,防止依赖冲突
<dependency>
<groupId>com.tongweb.springboot</groupId>
<artifactId>tongweb-spring-boot-starter-2.x</artifactId>
<version>8.0.E.9</version>
<exclusions>
<exclusion>
<groupId>com.tongweb</groupId>
<artifactId>tongweb-servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>com.tongweb</groupId>
<artifactId>tongweb-websocket</artifactId>
</exclusion>
</exclusions>
</dependency>
# 导入tongweb的websocket包,不导入启动会报错
<dependency>
<groupId>com.tongweb.springboot</groupId>
<artifactId>tongweb-spring-boot-websocket-2.x</artifactId>
<version>8.0.E.9</version>
</dependency>
# 导入servlet-api防止报错
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>compile</scope>
</dependency>
# 导入javax.websocket-api防止报错
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>compile</scope>
</dependency>
三、修复代码中的错误
1、TomcatFactoryConfig会报错,这个类是Tomcat Jasper的专属bug workaround。TongWeb 有自己的JSP引擎,根本没有这个问题,不需要任何替代。所以直接删掉或者整个注释掉就行了。
@Configuration
public class TomcatFactoryConfig {
/**
* tomcat-embed-jasper引用后提示jar找不到的问题
*/
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
}
};
factory.addConnectorCustomizers(connector -> {
connector.setProperty("relaxedPathChars", "[]{}");
connector.setProperty("relaxedQueryChars", "[]{}");
});
return factory;
}
}
2、WebSocketConfig中的ServerEndpointExporter也会报错。
- 原代码:
@Configuration
public class WebSocketConfig {
/**
* 注入ServerEndpointExporter,
* 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
@Bean
public WebsocketFilter websocketFilter(){
return new WebsocketFilter();
}
@Bean
public FilterRegistrationBean getFilterRegistrationBean(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(websocketFilter());
bean.addUrlPatterns("/websocket/*","/eoaSocket/*","/eoaNewChatSocket/*", "/newsWebsocket/*", "/vxeSocket/*");
return bean;
}
}
- 修改后代码:
@Configuration
public class WebSocketConfig implements WebSocketConfigurer {
/**
* 注入ServerEndpointExporter,
* 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
*/
// @Bean
// public ServerEndpointExporter serverEndpointExporter() {
// return new ServerEndpointExporter();
// }
@Resource
private WebSocketMsgHandler webSocketMsgHandler;
@Bean
public WebsocketFilter websocketFilter(){
return new WebsocketFilter();
}
@Bean
public FilterRegistrationBean getFilterRegistrationBean(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(websocketFilter());
bean.addUrlPatterns("/websocket/*","/eoaSocket/*","/eoaNewChatSocket/*", "/newsWebsocket/*", "/vxeSocket/*");
return bean;
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
// 路径和原来保持一致 /websocket/{userId}
registry.addHandler(webSocketMsgHandler, "/websocket/*")
.setAllowedOrigins("*"); // 跨域放开
}
}
- 新增类
@Service
public class WebSocketMsgHandler extends TextWebSocketHandler {
// 在线会话池
public static final Map<String, WebSocketSession> SESSION_POOL = new ConcurrentHashMap<>();
// 客户端连接成功
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// 从url路径提取userId
String path = session.getUri().getPath();
String userId = path.split("/websocket/")[1];
SESSION_POOL.put(userId, session);
}
// 接收客户端消息
@Override
protected void handleTextMessage(WebSocketSession session, org.springframework.web.socket.TextMessage message) throws Exception {
String payload = message.getPayload();
// 业务处理
}
// 连接关闭
@Override
public void afterConnectionClosed(WebSocketSession session, org.springframework.web.socket.CloseStatus status) throws Exception {
String path = session.getUri().getPath();
String userId = path.split("/websocket/")[1];
SESSION_POOL.remove(userId);
}
}
四、配置授权文件
1、把授权文件放到resources目录下:

image.png
2、在配置文件中配置授权文件位置:
application.yml:
server:
tongweb:
license:
path: classpath:license.dat
五、启动项目
启动项目的方式不变,启动后可以看到东方通的授权验证和Tongweb:

image.png