WebLogic 与 Spring 的兼容性
企业级 Spring Framework 的非侵入性 IoC 研发模型不仅依赖于对 J2EE 应用服务器可 用的特性集,而且旨在补充该特性集。事实上,在苛刻的生产环境中,底层应用服务器基 础架构所提供的服务质量对于 Spring 应用程式的可靠性、可用性和性能非常重要。 WebLogic Server 所提供的企业级特性能增强 Spring 应用程式的所有方面。
集群管理和部署
一个 WebLogic Server 集群包括多个 WebLogic Server 服务器实例,这些服务器实例 同时运行并一起工作,从而提高了可伸缩性和可靠性。对客户端来说是透明的,集群对外 就像单个的 WebLogic Server 实例一样。构成集群的服务器实例既能运行在同一台机器 上,也能位于不同的机器上。能通过在现有的机器上向集群添加另外的服务器实例,或向 集群添加机器以驻留增加的服务器实例,来提高集群的容量。
WebLogic Server 集群为 Spring 应用程式提供了一个企业级的部署平台,虽然其他的 技术产品也支持类似的特性,不过他们不具有 WebLogic Server 所提供的丰富性和易用 性。Spring 应用程式通常都被打包为 web 应用程式,这种情况下,要利用 WebLogic Server 集群就无需修改应用程式。只要把应用程式部署到集群中的服务器上,就能获得增 强的可伸缩性和可用性。
Spring 会话复制
Spring Web 应用程式习惯在 HTTP 会话中保存信息,比如订单 ID 和用户信息。为了支 持集群中 servlet 和 JSP 的自动复制和故障恢复,WebLogic Server 支持几种用于保持 HTTP 会话状态的机制。只要为应用程式提供正确的 weblogic.xml 部署描述符,Spring Web 应用程式就能非侵入性地使用这些机制。
集群化的 Spring 远程控制
Spring 提供功能强大的远程控制支持,允许用户轻松导出和使用远程服务,同时仍然 能利用基于 POJO 的一致编程模型。通过一个接合到适当的 Spring bean 的 RMI 接口, Vanilla Spring 支持代理 POJO 调用。然而,这种支持仅限于 JRMP(Sun 的 RMI 实现), 或通过 JndiRmiProxyFactoryBean 使用特定的远程接口。
借助于 Spring on WebLogic Server 认证,我们已扩展了 JndiRmiProxyFactoryBean 和相关的服务导出程式——这样他就能支持所有 J2EE RMI 实现的 POJO 代理,包括 RMI- IIOP 和 t3。
这方面的支持还包括一个 WebLogic RMI 部署描述符,他支持代理 RMI 接口上的集群 化,所以 POJO 调用能跨一个 WebLogic Server 集群进行负载均衡。集群化的描述符是自动 包含在内的,只需要以适当方式设置集群和将 Spring 应用程式部署到所有集群成员中。
对 Spring 组件的控制台支持
Spring on WebLogic Server 工具包中包含一个 WebLogic Server 控制台扩展,他显 示了定义在应用程式中的 Spring bean、属性和操作。他构建在 WebLogic 控制台扩展门户 框架之上,该框架能变换 WebLogic Administration 控制台的外观、功能和布局,而无需 修改服务器或控制台代码。将控制台扩展复制到 yourdomain/console-ext 目录下,则重新 启动服务器时就部署了控制台扩展。(参考 Spring on WebLogic Server 工具包)。
该扩展自动为不是 MBean 的 Spring bean(大多数 Spring bean)创建(JMX)管理接 口,然后在 applicationContext.xml 中设置一个 MbeanExporter,并指定哪些 bean 要通 过该 exporter 公开,这样控制台扩展就运行了。这项特性是 Spring 和 WebLogic Server 进行无缝和非侵入性合作的一个良好例证。要使应用程式支持 JMX,只需修改应用程式上 下文部署描述符。要使控制台支持 Spring,只需将一个简单的 jar 部署到现有的域即可。
(另)WebLogic10.3添加支持 Spring 的控制台扩展
a.登录到管理控制台。
b.在控制台中,单击工具栏上的首选项 。
c.在选项页,单击 扩展 。
d.选择复选框旁边的 Spring—console ,然后点击 启用 。
e.停止服务器,然后重新启动使更改生效。
Web 服务支持
Spring 远程控制功能的另一个方面是他对 RPC 风格 Web 服务的支持。WebLogic Server 提供基于 Ant 的工具,用于基于 Web 服务的 WSDL 描述生成 JAX-RPC 存根。Web 服务 客户端使用这些生成的存根来获取代表服务器端操作的一个远程接口。Spring 提供了一个 JaxRpcPortProxyFactoryBean 来简化了这个过程。我们发现,在 WebLogic Server 环境中 设置 JaxRpcPortProxyFactoryBean 有些棘手,所以为了节约客户的时间,我们给出下面这 个代码片断,演示怎么为一个包含复杂类型的 Document Literal 风格的 Web 服务设置代理 生成。
大部分属性都是顾名思义自解释的。其中有一些属性比较重要:
1) serviceInterface 是 Spring 的 setter 注入的副产品。这个类将表示 Web 服务操 作;
2) customProperties 属性支持制定的 WebLogic Server Web 服务存根属性;
3) jaxRpcService 值被设置为 WebLogic Server 生成的 JAX-RPC 实现服务。JAX-RPC 服务负责验证 Web 服务和加载复杂的类型映射。为了实现后者,必须把 WebLogic Server 的 JAX-RPC 服务实现设置为 Spring bean。这确保了 JAX-RPC 服务构造函 数的执行,这也是加载类型映射文件的地方。
把 JaxRpcPortProxyFactoryBean 上的 lookupServiceOnStartup 设置为 false,能关 闭启动期间的 JAX-RPC 服务查找。这样,查找将在首次访问时进行。这对于和 WebLogic Server 的可靠请求/响应 Web 服务通信的客户端来说是必须的,而且此处的客户端也必须 是个 Web 服务。通常在这些情况下,始发客户端是和 Web 服务客户端一起部署的。因为直 到应用程式部署完成才会激活 Web 服务,所以客户端 Web 服务对于 Spring 的上下文加载是 不可用的。
安全性
WebLogic Server 安全系统支持和扩展了 J2EE 安全性,同时提供一组丰富的安全提供 程式,你能对他们进行制定,然后使用他们来处理不同的安全性数据库或安全性策略。除 了使用标准的 J2EE 安全性之外,应用程式程式员还能使用非常多专有扩展,这些扩展使应 用程式能和安全系统紧密集成。
WebLogic Server 带有几个安全提供程式,例如,能选择包含大部分流行 LDAP 服务器 的身份验证数据库、Active Directory、本地视窗系统和一个内置的身份验证解决方案。 能使用制定的提供程式对内置的提供程式进行扩充,从而几乎能和任意身份验证数据库、 授权机制和凭证映射服务相集成。因为部署为 webapp 的 Spring 应用程式使用的是 J2EE 安 全性,所以无需修改应用程式就能获得 WebLogic Server 的安全性好处。
经验丰富的 Spring 用户还会熟悉 Acegi-Spring 自身的安全框架。目前,能在应用程 式中使用 Acegi、WebLogic Server 安全性,或同时使用二者,因为他们是相互独立的。
分布式事务
Spring 为事务管理提供了基础架构。除了对各家数据库供给商提供支持之外,Spring 还通过一家 J2EE 供给商的 JTA 实现支持分布式事务。通过WebLogicJtaTransactionManager,能把 Spring 的 JTA 管理器设置为和 WebLogic Server 的 JTA 实现一起工作。
WebLogicJtaTransactionManager 把责任直接委派给 WebLogic Server 的 Java Transaction API。WebLogic Server 的 JTA TransactionManager 接口能通过 JNDI 为客户端和 bean 提供者所用,而由 Spring 来管理这种交互。事务管理器还支持事务的作用域; 事务能作用于集群和域内部或二者之间。
WebLogicJtaTransactionManager 最强大的特性是管理分布式事务的能力和用于企业 应用程式的两阶段提交协议。通过采用 WebLogicJtaTransactionManager,应用程式能通 过 WebLogic Administration Console 来进行事务监视。WebLogicJtaTransactionManager 还支持按数据库(per-database)隔离级别,这种级别支持复杂的事务设置。
Java Management Extension
Java Management Extension(Java 管理扩展,JMX)是用于监视和管理 Java 应用程 式的规范。他使一般的管理系统能够监视应用程式,当应用程式需要注意时发出通知,并修改应用程式状态来补救问题。Spring 提供广泛的 JMX 支持,包括通过 Spring 的MBeanServerConnectionFactoryBean 公开 WebLogic Server 的 MBeanServer 的能力。MBeanServerConnectionFactoryBean 是个使用方便的工厂,他附带了一个MBeanServerConnection。在应用程式部署期间,连接被建立并缓存,以便稍后由引用bean 对其进行操作。
能设置 MBeanServerConnectionFactoryBean,使其返回 WebLogic Server 的 Runtime MBean Server,他会公开特定 WebLogic Server 实例的监视、运行时控制和活动设置。这 包括对 WebLogic Server 的 Diagnostics Framework 的访问。此外,Runtime MBean 还为 当前服务器提供对运行时 MBean 和活动设置 MBean 的访问。
还能设置 MBeanServerConnectionFactoryBean,获得一个到 WebLogic Server 的 Domain Runtime MBean Server 的连接。Domain Runtime MBean Server 提供对域范围内服 务的访问,比如应用程式部署、JMS 服务器和 JDBC 数据源。他还是访问域中所有服务器的 所有运行时 MBean 和活动设置 MBean 层次结构的单点。这个 MBean Server 还用作访问位于 托管服务器上的 MBean 的单点。
此外,能设置 MBeanServerConnectionFactoryBean,获得一个到 WebLogic Server 的 Edit MBean Server 的连接。Edit MBean Server 为管理当前 WebLogic Server 域设置提供 入口点。
注意,WebLogic Server 的 Domain Runtime MBean Server 在部署期间不是活动的。 因此,需要使用延迟初始化来设置 bean,他会在调用 bean 时获取该 bean。
WebLogic Server 上的 Spring Framework 版本兼容
下面分别对此进行详细的列表描述。
WLS9.x
编号 | 描述和变通方法或解决方案 | 相关版本 |
---|---|---|
CR242675 | 在 RMI 类加载器中发生了 NullPointerException。 变通方法或解决方案: 请与 BEA 客户支持联系以获取 WebLogic Server/Spring 合并修补程序。 | 9.0、9.2 |
CR236708 | 在 Hibernate 3 和 WebLogic Server 之间存在 Antlr 冲突。 变通方法或解决方案: 将 Antlr2.7.5.jar 放在 CLASSPATH 中的 weblogic.jar 之前。 | 8.1SP05、 9.0、9.2 |
CR242923 | T3 运行时无法对包含基元类型的类描述符进行解码。 变通方法或解决方案: 请与 BEA 客户支持联系以获取 WebLogic Server-Spring 合并修补程序。 | 9.0、9.2 |
CR242883 | IIOP 运行时无法对包含基元类型的类描述符进行解码。 变通方法或解决方案: 请与 BEA 客户支持联系以获取 WebLogic Server-Spring 合并修补程序。 | 9.0、9.2 |
CR237532 | Spring Framework 存在 Web 应用程序类加载问题。 变通方法或解决方案: 请与 BEA 客户支持联系以获取 WebLogic Server-Spring 合并修补程序。 | 8.1SP05、 9.0、9.2 |
CR241195 | 在 Spring Pet Clinic 示例应用程序中更新记录会导致 以下错误: java.lang.IllegalStateException: Cannot access session scope since the requested page does not participate in a session. at weblogic.servlet.jsp.PageContextImpl.getAttribute( PageContextImpl.java:273) at javax.servlet.jsp.jstl.core.Config.get(Config.java:145) at avax.servlet.jsp.jstl.core.Config.find(Config.jav a:393) at rg.apache.taglibs.standard.tag.common.fmt.TimeZon eSupport.getTimeZone(TimeZoneSupport.java:140) 变通方法或解决方案: 将 includes.jsp 文件中的第一行标记为注释。 | 9.0、9.2 |
CR244683 | HP-UX 需要 jdk150_01,而不是 jdk150_03。变通方法或解决方案:在 medrec-spring 目录中,使用 jdk150_01 替换 jdk150_03。 | 9.0、9.2 |
CR244693 | 当您从远程计算机上访问 MedRec-Spring 时,MedRec- Spring 退出功能不起作用。 变通方法或解决方案: 不从远程计算机访问 MedRec-Spring 应用程序,并且不 将 localhost 用于请求重定向。 | 9.0、9.2 |
CR244691 | 对 WebLogic 管理控制台的 Spring 扩展仅支持 Web 应 用程序 (.war) 文件,无法用于监视非 .war 文件(如 MedRec-Spring)中的 Spring Bean。 | 9.0、9.2 |
CR243957 | 使用 CTRL-C 关闭 WebLogic Server 时,如果正在破坏 bean domainMBeanServerConnection,则可能会发生关闭 异常。 变通方法或解决方案: 使用标志 -Dweblogic.slc=true 以便确定启动和停止 domainRuntimeServerService 的时间。 | 9.0、9.2 |
CR280985 | 无法通过将 countries_mbeans.war 应用程序复制到 WebLogic Server 域目录的 autodeploy 目录来自动部署 该应用程序。countries_mbeans.war Web 应用程序是一 个 Spring 测试扩展应用程序。 变通方法或解决方案: 使用 WebLogic Server 管理控制台来部署 countries_mbeans.war Web 应用程序,而不是自动部 署。 | 9.2 |
CR301115 | 在 Spring Pet Clinic 示例应用程序中运行单元测试会
导致以下错误:
从 weblogic.xml.jaxp.RegistrySAXTransformerFactory
中找不到有效的处理器版本实现
变通方法或解决方案:
通过将以下条目添加到
$java.home/lib/jaxp.properties 文件来定义 XML 解析
器类:
|
9.2 |
CR300748 | 访问部署到WebLogic Server 9.2 的 tiles-samples 时会出现异常。 | 9.2 |
WLS10.x
在该版本上Spring Framework 2.0.2经过了官方认证。
编号 | 描述和变通方法或解决方案 | 相关版本 |
---|---|---|
CR319968 | 使用 JRockit 时,OpenJPA 的 ClassFileTranformer 工 作不正常。 方案: 在编译阶段进行 enhence 而不要使用 LoadTimeWeaver 在 系统加载阶段 enhence. | 10.0 |
CR320649 | 使用 JRockit 时,在 WebLogic 上部署 Spring Pet Clinic 样例程序失败,产生和 OpenJPA 相关的异常。 方案: 将 JRockit 版本从 R26.4升级到 R27.2. | 10.0 |
Spring 中遇到的问题
抛砖引玉,这里先总结一个实际项目的测试结果。
测试环境:jdk1.6 、Spring2.0.5、Spring2.5;中间件:weblogic10.3.1、 weblogic8.1
经过测试,Spring2.0.5 在 weblogic8.1 表现良好。在部署的过程中没有出现什么问 题。Spring2.5 在 weblogic8.1 下就不能部署而且每次在报错,
Spring2.5 在 Weblogic10.3.1 表现良好。在部署的过程中没有出现什么问题, Spring2.0.5 在 weblogic10.3.1 下也会出现报错现象不能部署。
在 orcale 的官方网站上可以确认:
版本兼容性的问题
当 Spring 的版本升级到 2.5.6 的时候但是还是出现了报错现象错误提示是:
11:23:59,656 ERROR XFireServlet:51 - Error initializing XFireServlet. org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [org/codehaus/xfire/spring/xfire.xml]; nested exception is java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory cannot be cast to javax.xml.parsers.DocumentBuilderFactory
这个错误提示是说 WebLogic 的 RegistryDocumentBuilderFactory 类和 java 中 xml.parsers.DocumentBuilderFactory 类在编译的时候发生冲突。
这样的错误信息提示首先找到项目中的冲突包移除就没有什么了,所以我在项目中移 除了两个 jar 包:wstx-asl-3.2.0.jar 和 xml-apis-1.0.b2.jar,这样以实现成功部署。
关于项目开始出现的 nullbean 问题
这个问题主要是 Spring 的框架中的监听器没有加载,也就是在 web.xml 加载的时候就 失败啦。在 web.xml 中加载监听 Spring 提供了两种方式,但是达到的效果是一样的。
首先介绍 Spring 的监听器作用:ContextLoaderListener 的作用就是启动 Web 容器 时,自动装配 ApplicationContext 的配置信息。因为它实现了 ServletContextListener 这个接口,在 web.xml 配置这个监听器,启动容器时,就会默认执行它实现的方法。
在 ContextLoaderListener 中关联了 ContextLoader 这个类,所以整个加载配置过程 由 ContextLoader 来完成。ContextLoader 创建的是 XmlWebApplicationContext 这样一个 类,它实现的接口是 WebApplicationContext->ConfigurableWebApplicationContext- >ApplicationContext-> BeanFactory 这样一来 spring 中的所有 bean 都由这个类来创 建。
如果在 web.xml 中不写任何参数配置信息,默认的路径是"/WEB- INF/applicationContext.xml,在 WEB-INF 目录下创建的 xml 文件的名称必须是 applicationContext.xml。如果是要自定义文件名可以在 web.xml 里加入 contextConfigLocation 这个 context 参数:
<context-param > <param-name >contextConfigLocation</param-name ></pre > <param-value>/WEB-INF/classes/applicationContext-*.xml</param-value> </context-param>
在<param-value > </param-value >里指定相应的 xml 文件名,如果有多个 xml 文件, 可以写在一起并以“,”号分隔。上面的 applicationContext-*.xml 采用通配符,比如这 那个目录下有 applicationContext-ibatis-base.xml,applicationContext- action.xml,applicationContext-ibatis-dao.xml 等文件,都会一同被载入。