spring - 如何覆盖基于 web 服务器的 Spring bean

标签 spring deployment tomcat websphere

我正在构建一个应在 Tomcat 和 WebSphere 上运行的 Web 应用程序,并且我已经设法将几乎所有差异都放入具有默认值的属性中,我可以覆盖这些默认值以部署在 Tomcat 服务器上。

我需要为身份验证提供程序 bean 做另一个覆盖...

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    if(isWebSphere()){
        LOG.warn("Running on WebSphere... not overriding default authentication mechanism.");
        return;
    }
    LOG.info("Running on Tomcat... overriding authentication provider bean ("+AUTHENTICATION_PROVIDER_BEAN+")");
    if (beanFactory.containsBean(AUTHENTICATOR_BEAN) && beanFactory.containsBean(POPULATOR_BEAN) && beanFactory.containsBean(USERDETAIL_PROVIDER_BEAN)){
        LdapAuthenticator authenticator = (LdapAuthenticator) beanFactory.getBean(AUTHENTICATOR_BEAN);
        LdapAuthoritiesPopulator populator = (LdapAuthoritiesPopulator) beanFactory.getBean(POPULATOR_BEAN);
        UserDetailProvider userDetailProvider = (UserDetailProvider) beanFactory.getBean(USERDETAIL_PROVIDER_BEAN);
        ExtendedLdapAuthenticationProvider override = new ExtendedLdapAuthenticationProvider(authenticator, populator);
        override.setUserDetailProvider(userDetailProvider);

        beanFactory.registerSingleton(AUTHENTICATION_PROVIDER_BEAN, override);
    } else {
        throw new BeanCreationException("Could not find required beans to assemble overriding object for authentication...");
    }
}

现在我的问题是如何实现 isWebSphere() 方法。我在想 Class.forName("someWebSphereSpecific"),但有更好的方法吗?

最佳答案

ServletContext 包含一个方法 getServerInfo(),对于我的 tomcat,它返回“Apache Tomcat/6.0.13”。我假设 webSphere 会返回一些同样可区分的东西。

您唯一的问题就是如何获取 ServletContext。如果您在 getServletConfig() 下查找 APIdoc 索引,您会发现它可以从很多地方获得。如果您的 servlet 是由您的 bean 工厂创建的 bean,那么您可以调用 servletBean.getServletConfig().getServerInfo()

如果您创建的 bean 均未授予您访问权限,您可以创建一个纯粹用于执行此检测的虚拟 servlet - 不是最简洁的,但它应该可以工作。

关于spring - 如何覆盖基于 web 服务器的 Spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2445879/

相关文章:

javascript - Heroku ExecJS::ProgramError: Unexpected token: error rails

java - 如何将我的 Play Web 应用程序部署到我的服务器上

git - Git 推送后在接收后 Hook 中运行 Gulp

java - Tomcat 使用 Spring 和 Axis2 重新启动后,注入(inject)的 bean 为空

spring - 无法找到表的表元数据

spring - 仅当交换存在时,如何使用 Spring AMQP 绑定(bind)到主题?

java - Angular 6 Spring Boot POST 问题

tomcat - 关于 Tomcat 5.5 "ROOT"目录的问题

tomcat - 在 Tomcat 中设置 CORS header

java - 如何在 Spring 中访问命名空间元素的 BeanDefinitions