springboot项目集成东方通tongweb方法

项目环境
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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容