springboot项目中使用webscoket,当项目打成war包时,ServerEndpointExporter装配问题

这篇博客上面有关于springboot集成webscoket项目的简单实例以及一些注意事项:spring boot Websocket(使用笔记)

第一种方法:

我在项目中应用场景是我们项目只在生产环境部署war包,所以我通过pom获取文件中packaging标签判断打包方式,通过application.properties文件中的spring.profiles.active属性获取打包的环境.然后通过@Conditional注解判断是否符合装配条件,符合就装配,不符合就不装配. 不影响在开发过程中使用main方法运行项目. 测试成功.
以下详细步骤:
1.配置application.properties能够读取pom文件中的数据,然后读取打包方式
打包方式
build->resources标签下加入resource标签,内容如下,之后就可以在application.properties文件中获取pom中标签的值了.
filtering:为true或false,表示是否要为此资源启用过滤。请注意,不必定义过滤器* .properties文件以进行过滤 - 资源也可以使用,默认情况下在POM中定义的属性(例如$ {project.packaging}),使用传递到命令行“-D”标志(例如,“ - Dname = value ”)或由properties元素显式定义。上面介绍了过滤文件。(发现bug,如果不指定需要过滤的文件,会影响resource目录下其他的文件,我们项目里面的css文件放到resource下,就受到影响了,有很多矢量标签没有显示,所以这里加上includes,指定一下需要过滤的文件就行了)

<build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                	<include>application.properties</include>
            	</includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

在application.properties文件中获取pom中packaging打包方式.默认打包方式是jar.

package.style = @project.packaging@

注意: 如果你使用yml文件做配置文件的话,@project.packaging@可能会报错,只需要加两个单引号就行了 '@project.packaging@'

2.使用@Conditional注解,根据是否满足指定的条件来决定是否装配bean.Conditional注解类里只有一个 value属性,需传入一个 Condition类型的数组.Condition接口是一个函数式接口,创建一个类实现Condition接口,并实现Condition接口中的matches方法.以下是实现方法,matches方法返回true装配,返回false不装配.

/**
 * 判断是否使用webscoket容器,如果使用的是生产环境且是war包的方式不装配bean,使用方式@Conditional(WarAndJarWebscoketAutoWired.class)
 */
public class WarAndJarWebscoketAutoWired implements Condition {
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment env = context.getEnvironment();
        String packageStyle = env.getProperty("package.style");
        String active = env.getProperty("spring.profiles.active");
 //               return !packageStyle.equals("war");
       return ("jar".equals(packageStyle)&&"dev".equals(active));
    }
}

3.webscoket容器类.

@Configuration
public class WebSocketConfig {

   @Bean
   @Conditional(WarAndJarWebscoketAutoWired.class)
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

4.当符合环境是prod且打包方式是war时,ServerEndpointExporter不会装配到容器中.我们生产环境使用的是外部tomcat容器.
上面那个博客中可以看到为什么要这么做.这样的话每次部署到生产环境的话只需要修改环境和打包方式,不用每次都注释@Bean那块代码了
在这里插入图片描述

第二种方法:

1、直接使用外部容器中的jar包,
我们的项目运行在外部的tomcat中,tomcat下面的lib文件夹中已经包含了websocket的jar包,我们就可以直接使用这些jar包
在这里插入图片描述
idea中配置引用tomcat中jar包,在Setting中查找Application Servers,然后把需要的jar加进来。
在这里插入图片描述
加入项目依赖中
在这里插入图片描述
配置完成之后就可以使用websocket了,maven依赖中也不需要加websocket的依赖了,但是比较麻烦的是,启动的时候就不能使用main方法启动了,需要使用tomcat启动。

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值