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

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

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


        
            
                src/main/resources
                
                	application.properties
            	
                true
            
        
    

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

package.style = @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 !(packageStyle.equals("war")&&active.equals("prod"));
    }
}

3.webscoket容器类.

@Configuration
public class WebSocketConfig {

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

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

你可能感兴趣的:(It)