Apache CXF 在 WebLogic 9.2 上的问题定位分析及权宜之计

2023-11-09

Apache CXF 在 WebLogic 9.2 上的问题定位分析及权宜之计

 

本文关键词:技术 WebLogic Apache 中间件

  http://yulimin.javaeye.com/blog/129015

  同样的程序在 Tomcat 5.5.16/25 以及 Jetty 5.1.12 上都能够成功部署及运行,但是部署到 WebLogic 9.2 上时出错

  org.springframework.web.context.ContextLoader initWebApplicationContext

  FATAL: Context initialization failed

  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxWebService': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: portName

  Caused by: java.lang.NoSuchMethodError: portName

  at org.apache.cxf.jaxws.support.JaxWsImplementorInfo.getEndpointName(JaxWsImplementorInfo.java:154)

  at org.apache.cxf.jaxws.support.JaxWsServiceConfiguration.getEndpointName(JaxWsServiceConfiguration.java:89)

  at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.getEndpointName(ReflectionServiceFactoryBean.java:983)

  at org.apache.cxf.frontend.AbstractEndpointFactory.createEndpoint(AbstractEndpointFactory.java:91)

  at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:107)

  at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:147)

  at jrockit.reflect.VirtualNativeMethodInvoker.invoke(Ljava.lang.Object;[Ljava.lang.Object;)Ljava.lang.Object;(Unknown Source)

  at java.lang.reflect.Method.invoke(Ljava.lang.Object;[Ljava.lang.Object;I)Ljava.lang.Object;(Unknown Source)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1214)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1179)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1145)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:427)

  at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:251)

  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:144)

  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)

  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)

  at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:279)

  at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:360)

  at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:241)

  at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:184)

  at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)

  从 Stack Trace 来分析,Spring 在 ContextLoaderListener 进行加载配置文件时出错了。

  通过查看 JaxWsImplementorInfo.java:154 的源程序

  代码

  portName = wsAnnotations.get(x).portName();

  可以知道 wsAnnotations 的定义为

  代码

  private List wsAnnotations = new ArrayList (2);

  得到List里的对象类型为WebService,并得到全称为javax.jws.WebService

  通过 JarClassFind 来搜索,可以得到 Apache CXF 中的 geronimo-ws-metadata_2.0_spec-1.1.1.jar 包含有这个类

  而 WebLogic 9.2 中的则有两个 .jar 文件包含有此类:

  No.1

  Jar Package:%WLS_HOME%/server/lib/api.jar

  No.2

  Jar Package:%WLS_HOME%/server/lib/weblogic.jar

  经过对比,WebLogic 9.2 里的两个 .jar 文件里带个类是一样的,况且,正常启动时 WebLogic 也只是将 weblogic.jar 加到 CLASSPATH 中。

  问题猜测应当是由于这两类的版本不一样导致的,拆出来 jad 一下,WebLogic 中的 javax.jws.WebService.java 代码为:

  代码

  package javax.jws;

  

  import java.lang.annotation.Annotation;

  

  public interface WebService

  extends Annotation

  {

  

  public abstract String name();

  

  public abstract String targetNamespace();

  

  public abstract String serviceName();

  

  public abstract String wsdlLocation();

  

  public abstract String endpointInterface();

  }

  拆出 Apache CXF 里的 javax.jws.WebService jad 一下,代码为:

  代码

  package javax.jws;

  

  import java.lang.annotation.Annotation;

  

  public interface WebService

  extends Annotation

  {

  

  public abstract String name();

  

  public abstract String targetNamespace();

  

  public abstract String serviceName();

  

  public abstract String wsdlLocation();

  

  public abstract String endpointInterface();

  

  public abstract String portName();

  }

  这下就完全明白了,是 Apache CXF 期望加载的 javax.jws.WebService 注解与 Weblogic 中 javax.jws.WebService 注解版本不一致导致的。

  OK,现在首先想到的是在 weblogic.xml 设置 prefer-web-inf-classes 为 true 来提前加载了。如下:

  代码

  

  

  

   true

  

  

  总以为能够象往常一样,这样可以了,但是将 prefer-web-inf-classes 设置为 true 后,却发生了另一个异常了:

  代码

  FATAL: Context initialization failed

  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxWebService': Invocation of init method failed; nested exception is java.lang.LinkageError: Class javax/xml/namespace/QName violates loader constraints

  Caused by: java.lang.LinkageError: Class javax/xml/namespace/QName violates loader constraints

  at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl. (RuntimeBuiltinLeafInfoImpl.java:186)

  at com.sun.xml.bind.v2.model.impl.RuntimeTypeInfoSetImpl. (RuntimeTypeInfoSetImpl.java:25)

  at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:84)

  at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:41)

  at com.sun.xml.bind.v2.model.impl.ModelBuilder. (ModelBuilder.java:104)

  at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder. (RuntimeModelBuilder.java:49)

  at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:372)

  at com.sun.xml.bind.v2.runtime.JAXBContextImpl. (JAXBContextImpl.java:236)

  at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:76)

  at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:55)

  at jrockit.reflect.InitialMethodInvoker.invoke(Ljava.lang.Object;[Ljava.lang.Object;)Ljava.lang.Object;(Unknown Source)

  at java.lang.reflect.Method.invoke(Ljava.lang.Object;[Ljava.lang.Object;I)Ljava.lang.Object;(Unknown Source)

  at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:210)

  at javax.xml.bind.ContextFinder.find(ContextFinder.java:366)

  at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)

  at org.apache.cxf.jaxb.JAXBDataBinding.createJAXBContext(JAXBDataBinding.java:377)

  at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:182)

  at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:244)

  at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:272)

  at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:146)

  at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:89)

  at org.apache.cxf.frontend.AbstractEndpointFactory.createEndpoint(AbstractEndpointFactory.java:83)

  at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:107)

  at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:147)

  面对这个 java.lang.LinkageError: Class javax/xml/namespace/QName 错误,自然又联想到了版本不一致的问题。

  继续 JarClassFind ,在 Apache CXF 里找到 stax-api-1.0.1.jar 包含有这个类。

  No.1

  Jar Package:%WLS_HOME%/server/lib/api.jar

  No.2

  Jar Package:%WLS_HOME%/server/lib/weblogic.jar

  No.3

  Jar Package:%WLS_HOME%/server/lib/webserviceclient+ssl.jar

  No.4

  Jar Package:%WLS_HOME%/server/lib/webserviceclient.jar

  No.5

  Jar Package:%WLS_HOME%/server/lib/xbean.jar

  同样与 WebLogic 启动时有关的仍是 weblogic.jar ,怪异的是 WebLogic 中居然有三个版本的 javax/xml/namespace/QName 这个类,真是比较糟糕的事情。

  api.jar、weblogic.jar 与 webserviceclient+ssl.jar、webserviceclient.jar 和 xbean.jar 中各是一个版本。

  但是通过 jad 发现 weblogic 里的 javax/xml/namespace/QName 与 Apache CXF 里的是一样的,比较奇怪了。。。

  再进行认真地比较发现,文件的时间不同,再直接进行对比 .class 文件,还是有两处有不同之处。Apache CXF 的时间晚于 WebLogic 里的类的时间,于是只能怀疑后者引起类在加载时发生了 java.lang.LinkageError 错误。

  经查JDK文档:LinkageError 的子类指示一个类在一定程度上依赖于另一个类;但是,在编译前一个类之后,后一个类发生了不相容的改变。

  于是真相大明了?因为 Apache CXF 里的类的时间晚于 WebLogic 里的类的时间,而且类的二进制内容也发生了改变,于是原来 WebLogic 里的其它类由于我们通过了 prefer-web-inf-classes 设置为 true 后,而引用到了现在的 Apache CXF 里的类了,就发生了 java.lang.LinkageError 错误。

  由于设置 prefer-web-inf-classes 设置为 true 后,提前加载了应用程序中 lib 目录下的 .jar 文件,而发生了这个问题,于是就尝试去掉 prefer-web-inf-classes 的设置,直接在 WebLogic 的启动脚本中增加第一次异常时相关的 jar 到 CLASSPATH 中,即 geronimo-ws-metadata_2.0_spec-1.1.1.jar 文件,只提前加载这个 jar 文件。

  代码

  set CLASSPATH_CXF=X:/xyz/geronimo-ws-metadata_2.0_spec-1.1.1.jar

  set CLASSPATH=%CLASSPATH_CXF%;%CLASSPATH%;%MEDREC_WEBLOGIC_CLASSPATH%

  于是,再次进行启动,这下则可以正常启动了。

  为了支持 Aegis ,除了必需的之外,还需要再增加如下 jar 包:

  - jaxen.jar

  - jdom.jar

  - stax-utils.jar  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache CXF 在 WebLogic 9.2 上的问题定位分析及权宜之计 的相关文章

  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • css设置内外边框距离

    margin属性可以有一到四个值 p gt margin 25px 50px 75px 100px 上边距为25px 右边距为50px 下边距为75px 左边距为100px margin 25px 50px 75px 上边距为25px 左右
  • Ubuntu20.04 安装 Tomcat 9.0.34

    最近开始使用 Ubuntu 在上面安装 Tomcat了 记录一下 具体步骤和直接在 CentOS 上面的差不多 一 解压安装包 tar zxvf apache tomcat 9 0 34 tar gz 二 修改目录所有权 用ll命令查询 修
  • PAT——团体程序设计天梯赛-练习集(5分题集)Python 3

    该博客记录我参加天梯赛 1 Hello World print Hello World 2 计算摄氏温度 print fahr 100 celsius format int 5 100 32 9 3 计算指数 n int input pri
  • Webservice接口数据抽取_kettel<一>

    在进行ETl数据抽取的时 有时会遇到Webservice接口服务的情况 这里对kettel工具和java脚本两种抽取方式来简单的介绍一下 由于篇幅较长 我分四篇来介绍 下一篇地址 Webservice接口数据抽取 kettel lt 二 g
  • xml 入门 shema_01

    shema基础 shema的使用 shema的属性和语法 相应的源码 1 shema的格式
  • Java静态代理、动态代理(JDK代理、CGLIB代理)常见面试题

    小结 静态代理不灵活 静态代理类似模板方法设计模式 动态代理灵活 方便 每个框架都会使用到 例如 spring中的AOP 默认为JDK实现方式 也可选择CGLIB实现方式 JDK动态代理只能代理实现接口的类或者直接代理接口 限制 必须要有接
  • 51单片机c语言随机函数,[转载]51单片机中生成随机数

    随机数在单片机的应用中也是很多的 当然产生随机数的方法有很多 当中有一个就是利用单片机定时器 取出未知的定时器THX和TLX的值 再加以运算得到一个规定范围内的随机数值 这做法也是可行的 或者预先写好一个随机数表 然后进行取数据 也是可以的
  • Web开发文稿

    前言 首先 目前主流开发工具有很多 而且更新迭代的速度非常迅速 所以这里只谈一些基础的概念 如前后端的交互到底是怎么交互的 这也是我在学习网页开发的很困惑的东西 一 我的开发工具 网页界面 html css 浏览器脚本 js 服务器脚本 p
  • android studio全局搜索 快捷键

    全局搜索 gt 项目下的APP目录 gt 右键 gt Find in path 快捷键 Ctrl h
  • 去掉IntelliJ IDEA 中 mybatis 对应的 xml 文件警告

    版权声明 本文为博主原创文章 如需转载 请写明出处 尊重他人即尊重自己 http blog csdn net aubdiy article details 68485336 IntelliJ IDEA 打开 mybatis 的 xml 文件
  • 每天一个shell小知识(case)

    Case语句 case 结构 例1 case Case语句主要适用于 某个变量存在多种取值 需要对其中的每一种取值分别执行不同的命令序列 这种情况和多分支if语句非常相似 只不过if要判断多个不同的条件而case语句只判断一个变量的不同取值
  • Go Casbin 编写 MySQL适配器

    在 Go Casbin 中使用 MySQL 作为策略存储是一种常见的方式 下面是一个简单的示例 演示了如何在 Go Casbin 中使用 MySQL 首先 我们需要导入 MySQL 驱动程序和 Casbin import github co
  • 网络编程之三

    代码1 chat tcp client1 c include header h int main int argc char argv int connfd 1 if 0 gt connfd socket AF INET SOCK STRE
  • Markdown 语法的简要规则

    Markdown 语法的简要规则 标题 标题是每篇文章都需要也是最常用的格式 在 Markdown 中 如果一段文字被定义为标题 只要在这段文字前加 号即可 一级标题 二级标题 三级标题 以此类推 总共六级标题 建议在 号后加一个空格 这是
  • tkinter:嵌套子窗口操作步骤

    tkinter 嵌套子窗口操作步骤 0 导入模块 import ctypes import tkinter as tk u32 ctypes windll user32 1 主窗口创建 a tk Tk 父窗口 a geometry 800x
  • 【Spark NLP】第 12 章:情感分析和情绪检测

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Python3中常用模块-sys模块

    目录 1 获取模块文档 1 1 使用sys doc 查看方法说明 1 2 使用dir函数获取模块中的所有属性和方法 1 3 使用help函数查看某个函数 2 模块常用方法 3 解析命令行参数 sys模块和os模块是Python系统相关工具集
  • git分支管理

    Create the branch on your local machine and switch in this branch git checkout b name of your new branch Push the branch
  • python 把数字写入文件

    初学python 还不是很了解 其实只要用str 将数字包住即可 如下 file write str 12
  • Apache CXF 在 WebLogic 9.2 上的问题定位分析及权宜之计

    Apache CXF 在 WebLogic 9 2 上的问题定位分析及权宜之计 本文关键词 技术 WebLogic Apache 中间件 http yulimin javaeye com blog 129015 同样的程序在 Tomcat