apache cxf_Wildfly,Apache CXF和@SchemaValidation

apache cxf

在过去的几天中,我一直在进行从JBoss 4到Wildfly 8的应用程序迁移。 该应用程序使用了不同的技术,但是我们这里将重点放在XML Web Services JAX-WS上 。 是的,我知道它们不再流行了,但是它们是很久以前开发的,因此需要维护以解决兼容性问题。

无论如何,迁移这些服务的途径并不容易。 我正在分享一些问题和修补程序,希望它们可以帮助其他在那里遇到相同问题的开发人员。

样本定义

这是旧系统JBoss 4中Web服务定义的示例:

@javax.jws.WebService(endpointInterface = "some.pack.age.WebService")
@javax.jws.soap.SOAPBinding(style = SOAPBinding.Style.DOCUMENT)
@org.jboss.ws.annotation.EndpointConfig(configName = "Standard WSSecurity Endpoint")
@javax.jws.HandlerChain(file = "handlers.xml")
@org.jboss.ws.annotation.SchemaValidation(enabled = true, errorHandler = CustomErrorHandler.class)
public class WebServiceImpl implements WebService {

幸运的是,大多数定义都使用标准的Java EE注释。 只有@org.jboss.ws.annotation.EndpointConfig@org.jboss.ws.annotation.SchemaValidation来自旧的JBossWS库。

我们可以轻松摆脱@org.jboss.ws.annotation.EndpointConfig因为在新的应用程序中我们将不需要它。 作为参考,它用于设置要通过端点预定义的额外配置数据。 检查文档预定义的客户端和端点配置 。

我们要保留@org.jboss.ws.annotation.SchemaValidation 。 作为参考,此批注根据端点wsdl契约中的相关模式验证传入和传出SOAP消息。 由于注释不再存在于JBossWS中,我们必须使用Apache CXF ,这是Wildfly上JAX-WS的基础实现。

问题

这是我遇到的一些问题:

SchemaValidation批注

注释@org.jboss.ws.annotation.SchemaValidation不再存在。 您必须使用来自Apache CXF的注释org.apache.cxf.annotations.SchemaValidation

添加以下Maven依赖项以使用Apache CXF批注:

<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-api</artifactId><version>2.7.11</version><scope>provided</scope>
</dependency>

另外,请注意,在原始注释中,我们可以定义errorHandler属性。 旧的应用程序使用自定义错误处理程序来针对架构验证错误设置自定义错误消息。 新注释中没有等效项,因此我们需要以另一种方式进行。 为了复制旧的行为,我使用了Apache CXF拦截器 。 创建一个拦截器类并扩展AbstractPhaseInterceptor 。 这是一个示例:

public class SchemaValidationErrorInterceptor extends AbstractPhaseInterceptor<Message> {public SchemaValidationErrorInterceptor() {super(Phase.MARSHAL);}@Overridepublic void handleMessage(Message message) throws Fault {Fault fault = (Fault) message.getContent(Exception.class);Throwable cause = fault.getCause();while (cause != null) {if (cause instanceof SAXParseException) {fault.setMessage("Invalid XML: " + fault.getLocalizedMessage());break;}cause = cause.getCause();}}
}

您可以像这样使用它:

@org.apache.cxf.interceptor.OutFaultInterceptors(classes = SchemaValidationErrorInterceptor.class
)

CXF客户端和CXF服务器都使用拦截器。 正在执行传入和传出拦截链以进行常规处理以及发生错误时。 在这种情况下,我们要覆盖Schema Validation消息,因此我们需要将拦截器绑定到错误输出拦截器链中。 您可以将@OutFaultInterceptors注释用于该行为。 每个链均分为多个阶段。 您可以通过在构造函数中传递Phase.MARSHAL来定义希望拦截器运行的Phase.MARSHAL 。 还有其他阶段,但是由于我们要更改错误消息,因此我们在MARSHAL阶段进行此操作。

不同的WSDL

旧的Web服务具有在部署时自动生成的WSDL文件。 不幸的是,在某些情况下,JBoss 4和Wildfly 8生成的WSDL是不同的。 这可能会导致您的外部呼叫者出现问题。 在这种情况下,主要问题在于架构验证。 在Wildfly 8中执行时,在JBoss 4中有效的请求不再有效。

此行为的原因是在目标名称空间中。 如果您在Web Service参数中使用带注释的@XmlRootElement ,而没有在注释中定义namespace属性,则JBoss 4 WS会生成带有黑色命名空间的目标WSDL元素。 如果CWSF元素为空,则Apache CXF将使用Web服务默认名称空间来绑定WSDL元素。 作为参考,这是通过CXF代码完成的: org.apache.cxf.jaxws.support.JaxWsServiceConfiguration#getParameterName

可以通过更改CXF代码来解决此问题,但是我们选择将旧生成的WSDL文件放置在迁移的应用程序源中,并将其包含在发行版中。 它不再自动生成,这意味着如果我们更改API,则需要手动生成WSDL。 我们需要小心确保未在WSDL中破坏任何内容。 这种方法似乎比必须维护我们自己的CXF版本更好。 我们可能也可以为此提交修复程序,但是我们认为JBoss 4行为不是故意的。

启动CXF

要使用来自CXF的特定API,还不足以为其具有项目依赖性。 实际上,在我尝试更改的前几次中,似乎没有与CXF相关的功能。 发生这种情况是因为Wildfly只在寻找标准的Java EE JAX-WS注释。 为了使所有CXF行为正常工作,我们需要告诉Wildfly我们的应用程序依赖于CXF ,即使这些库已经在服务器上了。 是的,这有点令人困惑。

该应用程序部署在EAR文件中。 因此,您需要创建一个jboss-deployment-structure.xml并添加以下内容:

<jboss-deployment-structure><sub-deployment name="application.war"><dependencies><module name="org.apache.cxf"/></dependencies></sub-deployment></jboss-deployment-structure>

如果将WAR文件中的MANIFEST.MF部署在EAR文件中,则显然无法使用。 有关更多信息,请检查WildFly中的类加载 。

如果您想使用其他CXF功能,尤其是与Spring链接的功能,则可能会有些棘手。 看一下这篇文章: 有关JBoss的各种事实。 事实6:JBoss和CXF:天造地设 。

最终定义

这应该是我们对Web服务的最终定义:

@WebService(wsdlLocation = "WebService.wsdl",endpointInterface = "some.pack.age.WebService"
)
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT)
@HandlerChain(file = "/handlers.xml")
@SchemaValidation(type = SchemaValidation.SchemaValidationType.IN)
@OutFaultInterceptors(classes = SchemaValidationErrorInterceptor.class)
public class WebServiceImpl implements BDNSWebService {

如您所见,将Web服务从JBoss 4迁移到Wildfly所需的更改只是其中的一部分。 但是,如果您不了解一些细微的细节,可能会长时间阻止您。 也许您有不同的设置,并且遇到的问题也有所不同。 如果您只是想通过Wildfly设置CXF ,这也可以有所帮助,希望本文对您有所帮助。

翻译自: https://www.javacodegeeks.com/2015/05/wildfly-apache-cxf-and-schemavalidation.html

apache cxf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win7系统如何访问xp系统的服务器,WIN7系统怎么让XP系统访问呢

WIN7系统怎么让XP系统访问呢如果你发现某些程序出现兼容性问题&#xff0c;你有以下4种选择&#xff1a;1) XP兼容模式。右击程序文件或开始菜单中的快捷方式&#xff0c;选择属性&#xff0c;点击兼容性选项&#xff0c;在下拉菜单中选择在XP环境下运行。2) 升级到最新版本&am…

C语言基础知识储备,给你送干货啦!

点击上方蓝字关注我&#xff0c;了解更多咨询C 语言的特点C 语言程序设计就是结构化程序设计&#xff0c;它的主要观点是采用自顶向下、逐步细分和模块化的程序设计方法&#xff0c;使用顺序、选择、循环三种基本控制结构来构造程序。世间万物都有两面性&#xff0c;C 语言既有…

dalsa工业相机8k参数_工业传感器再掀巨浪 | Teledyne 以80亿美元收购FLIR,互补性产品组合又增体量...

收购 / Acquisitions2021年1月4日&#xff0c;Teledyne和FLIR联合宣布&#xff0c;双方已经达成了一项最终协议&#xff0c;Teledyne将以价值约80亿美元的现金和股票交易收购FLIR。根据协议条款&#xff0c;FLIR股东将以每股FLIR股份的价格获得每股28美元的现金和0.0718股Tele…

jms.jar 2.0_JMS 2.0中JMSContext的类型

jms.jar 2.0如果您遵循Java EE&#xff0c;那么您将不会知道JMS 2.0&#xff08;Java EE 7&#xff09;中的简化API组件。 构成简化API一部分的重要接口之一是javax.jms.JMSContext接口。 根据实例的获取和管理方式&#xff08;生命周期&#xff09;&#xff0c;JMSContext可以…

配置多个git账号_docker随手笔记第七节 jenkins通过git部署java微服务插件安装

docker随手笔记第一节 docker概念及安装docker随手笔记第二节 docker常用命令解析docker随手笔记第三节 docker构建java镜像docker随手笔记第四节 docker安装mysql5.7docker随手笔记第五节 docker安装redis4.0jenkins部署git的java微服务需要如下插件SSH plugin (远程登陆到服务…

适合新手入门—嵌入式C语言

点击上方蓝字关注我&#xff0c;了解更多咨询你现在被数百种电子设备包围着&#xff0c;虽然这些设备表面看起来很简单&#xff0c;但它们的体内都运行着复杂的微处理器(或微控制器)。微处理器的功能由嵌入式系统软件控制、引导和监督。嵌入式软件和嵌入式硬件构成了一个嵌入式…

怎样编写测试类测试分支_编写干净的测试–天堂中的麻烦

怎样编写测试类测试分支如果我们的代码有明显的错误&#xff0c;我们很有动力对其进行改进。 但是&#xff0c;在某些时候&#xff0c;我们认为我们的代码“足够好”并继续前进。 通常&#xff0c;当我们认为改进现有代码的好处小于所需的工作时&#xff0c;就会发生这种情况。…

access无法与wincc链接_wincc和Access连接写如变量

我要把在WINCC中设定的变量(多个变量)保存到ACCESS数据库,用的时候再从ACCESS中提取写入PLC,分别用保存,读取,增加,按钮实现,怎么做,最好详细说明,最佳答案WinCC 对一个小型数据库进行查询、插入等操作&#xff0c;推荐使用 MS Access 比较方便。大致步骤如下&#xff1a;1、电…

如何学习C语言数据结构?

点击上方蓝字关注我&#xff0c;了解更多咨询C语言的数据结构与算法&#xff0c;难就难在链表&#xff0c;学会了链表&#xff0c;可能后面就一点都不难了。书籍推荐《数据结构与算法分析—C语言描述版》&#xff0c;要深入学习的话可以选择这本书&#xff0c;因为针对链表的讲…

数组做参数_C语言进阶之路:函数—数组参数!

数组参数属于指针参数.指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径.如果把数组当作参数, 不管你愿意与否, 它就是指针, 指向第一个值的指针.1. 数组参数就是指向第一个元素的指针:2. 干脆直接声明为指针:3. 即使你在形参中指定维数也不起…

wso2 esb_使用WSO2 ESB进行邮件内容过滤

wso2 esb每个集成设计师或开发人员都应该熟悉Gregor Hohpe和Bobby Woolf所描述的企业集成模式&#xff08;EIP&#xff09; 。 模式之一是“内容消息过滤器” &#xff08;不要与消息过滤器模式混淆&#xff09;。 使用不同的Mediator在WSO2中有多种方法可以实现此目的。 一种…

c语言中的/和%表示什么意思

点击上方蓝字关注我&#xff0c;了解更多咨询%代表求余运算符号&#xff1b;/代表除法运算符号。1、求余是一种数学计算方法&#xff0c;指一个数除以另一个数&#xff0c;不够除的部分就是余数&#xff0c;就是求余的结果。一个数除以另一个数&#xff0c;要是比另一个数小的话…

vue 脚手架测试环境_关于单元测试脚手架的几点思考

vue 脚手架测试环境莱昂&#xff1a;Luc Besson的专业人士 当我开始通过创建相同的对象并准备用于运行测试的数据来重复进行单元测试方法时&#xff0c;我对设计感到失望。 带有大量代码重复的长测试方法看起来并不正确。 为了简化和缩短它们&#xff0c;基本上有两个选择&…

Lightly:新一代的C语言IDE

点击上方蓝字关注我&#xff0c;了解更多咨询C语言最初是作为Unix系统的开发工具而发明&#xff0c;现如今已成为最广泛使用、最流行的编程语言之一。它具有如下几个特点&#xff1a;&#xff08;1&#xff09;低级语言它是一种建立在底层构建逻辑的机器语言&#xff0c;可以直…

大篆汉字对照表_篆书转换器软件下载(篆体字转换汉字对照表)

笔顺篆书的笔顺和汉字笔顺规则基本相仿&#xff0c;如先横后竖、从上到下、从左到右等&#xff0c;这些对初学者来说是不成问题的。重要的是和汉字不同的笔顺&#xff0c;而这些不同之处正是篆书笔顺的特点&#xff0c;掌握了这些特点&#xff0c;就能把握好篆书的结体&#xf…

java 8 lambda_异常作弊– Java 8 Lambdas

java 8 lambda异常作弊– Java 8 Lambdas 撇开关于Checked vs Runtime异常的宗教辩论&#xff0c;有时由于库的构造不佳&#xff0c;处理Checked示例会使您发疯。 考虑一下您可能要编写的以下代码片段&#xff1a; public void createTempFileForKey(String key) {Map<Str…

c语言程序的基本单位是什么呢?

点击上方蓝字关注我&#xff0c;了解更多咨询随着科技的不断发展&#xff0c;电脑等终端设备已经成为我们生活中不可或缺的工具&#xff0c;而希望学习程序设计语言的朋友也越来越多&#xff0c;那么c语言的基本单位是什么呢&#xff1f;其实&#xff0c;c语言的基本单位是函数…

困难时拉你一把的图片_人生感悟语录:最不能忘记的,是在你困难时拉你一把的人...

1、人&#xff0c;最不能忘记的&#xff0c;是在你困难时拉你一把的人;最不能结交的&#xff0c;是在你失败时藐视你的人;最不能相信的&#xff0c;是在你成功时吹捧你的人;最不能抛弃的&#xff0c;是和你同创业共患难的人;最不能爱的&#xff0c;是不看重你人格的人。2、人生…

关于C语言中的memset()函数你了解多少

点击上方蓝字关注我&#xff0c;了解更多咨询1.函数原型及功能memset()函数原型为&#xff1a;函数功能&#xff1a;将_Dst所指区域的前size_t个字节均初始化为_val&#xff0c;调用时需要引用string.h头文件memset()函数多用于数组和结构体这种占用内存比较大的数据结构的初始…

如何判断无法到达目标的拼图_拼图项目的动机和目标

如何判断无法到达目标的拼图几周前&#xff0c;我写了一篇关于Jigsaw项目可能如何破坏现有代码的文章 。 那么我们得到什么回报呢&#xff1f; 让我们看一下项目解决的痛点及其在Java 9中解决问题的目标。 系列 这篇文章是正在进行的有关拼图项目系列的一部分。 按照推荐的顺序…