Wildfly,Apache CXF和@SchemaValidation

在过去的几天中,我一直在进行从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

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

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

相关文章

linux网络体系架构

原创kylin_zeng:http://blog.csdn.net/kylin_fire_zeng 本文参考国嵌视频教程&#xff0c;再此感谢国嵌教育。 一、协议栈层次对比&#xff1a; 1&#xff09;网络接口层把数据链路层和物理层合并在了一起&#xff0c;提供访问物理设备的驱动程序&#xff0c;对应的网络协议主…

android 自定义弹窗diss,Android中自定义PopupWindow,动态弹窗。

我的第一篇博客&#xff0c;咱们直奔主题。先上个效果图在android中自定义PopupWindow&#xff1a;1、首先定义好你想要显示的窗口的布局文件&#xff0c;再实例化一个View对象&#xff1a;窗口布局可灵活变化&#xff0c;dialog_layout.xml代码如下&#xff1a;android:id&quo…

拼图项目的动机和目标

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

android中按一个按钮弹出字,允许用户在Android中长按一次即可编辑按钮文字

我想允许App用户在Android中更改Button文本。 当用户单击按钮时&#xff0c;它应该执行某些操作&#xff0c;但是当他/她长按按钮时&#xff0c;将弹出一个编辑文本&#xff0c;并且无论用户键入什么内容都应另存为按钮文本。到目前为止&#xff0c;我已经完成了以下操作。btn1…

异常作弊– Java 8 Lambdas

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

hdu 4738 桥

题目&#xff1a;还是自己看题目吧 trick&#xff1a;当不连通时不需要人去炸。否则&#xff0c;当桥的费用为0时当然需要一个人去炸。。。 #include <set> #include <map> #include <list> #include <cmath> #include <queue> #include <sta…

关于单元测试脚手架的几点思考

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

android 使用c 代码实现,JNI开发实现helloworld,调用自己的C代码实现(1)

JNI开发&#xff0c;实现自己的C代码&#xff0c;helloworld在这里实现一个简单的demo,完成加载自己的C代码使用Android studio&#xff0c;一步一步教你实现在屏幕上显示出helloworld如下图显示&#xff0c;配置号NDK的路径&#xff0c;没有路径的需要自己下载&#xff0c;在A…

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

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

BZOJ 1045 [HAOI2008]糖果传递 ★(环形等分:中位数)

题意 有n个小朋友坐成一圈&#xff0c;每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。 思路 假设平均数是x&#xff0c;且a1给an了k个&#xff08;k<0说明是an给a1了-k个&#xff09;&#xff0c;那么总代价就可以算出来&#xff1a; ananka1-…

android壁纸应用,HPSTR - 可能是你见过最会玩的壁纸应用 - Android 应用 - 【最美应用】...

今天这款 HPSTR 壁纸应用也不例外&#xff0c;HPSTR 主要的壁纸素材源来自 Unsplash(ios/android)、500px(android)、Reddit(android)这些素材源的图片都很优秀&#xff0c;特别是 Unsplash 它是著名的无版权图片网站。它家主要以风景为主&#xff0c;数量也足够多&#xff0c;…

android sqlite批量操作,Android: SQLite批量插入数据的最佳实践

大家都知道&#xff0c;Android里数据库用的是SQLite。在实际开发过程中&#xff0c;我们有时候会遇到批量插入数据的场景。这篇文章给大家分享一个小技巧&#xff0c;让批量插入数据达到最快的目的。首先&#xff0c;我先创建一个Table&#xff0c;里面只有一个字段&#xff1…

编写干净的测试–天堂中的麻烦

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

使用Mockito时遇到的一些问题

最近在使用Mockito时遇到了几个比较tricking的问题&#xff0c;在这里记录一下。 1.如果方法的参数或者返回类型是泛型通配符相关的&#xff08;如<?>&#xff0c;<? extends XXX>&#xff09;&#xff0c;不管你定义的对象类型是否正确匹配&#xff0c;用any(ma…

c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标...

自开始负责生产环境部署&#xff0c;中间遇到了若干线上环境内存以及CPU的问题。由于微服务以及容器的流行&#xff0c;现在已经可以很方便的使用 K8s prometheus grafana alert 的方式进行监控&#xff0c;这足以覆盖大部分场景。最重要的事情已经交由最适合的组件去做&…

android config.mk,android编译分析之10—config.mk

config.mk可以说是android编译系统中关于配置环境的一个总的makefile&#xff0c;定义了编译环境的方方面面。执行完config.mk就完成了android编译系统的所有准备工作&#xff0c;即准备好了所有的编译需要的全局变量&#xff0c;下一步直接执行make&#xff0c;即可产生镜像文…

在Spring中记录JAX-WS SOAP消息

每当在Spring中使用JAX-WS时&#xff0c;您可能都希望记录传入和传出的SOAP消息-如果仅用于开发过程中的调试。 因此&#xff0c;第一件事就是增加日志级别&#xff0c;对吗&#xff1f; 不幸的是&#xff0c;这将无效。 您将要做的是利用javax.xml.ws.handler.HandlerResolver…

WordPress /wp-admin/includes/post.php user_ID 参数操作权限提升漏洞

漏洞版本: WordPress 3.6 漏洞描述: Bugtraq ID:62346 CVE ID:CVE-2013-4340WordPress是一种使用PHP语言开发的博客平台&#xff0c;用户可以在支持PHP和MySQL数据库的服务器上架设自己的网志WordPress wp-admin/includes/post.php脚本在处理user_ID参数时存在一个安全漏洞&…

rip协议中周期性广播路由信息的报文_技术实操||距离矢量路由协议-RIP

距离矢量路由协议—RIP01距离矢量路由协议概述路由信息协议RIP(RoutingInformation Protocol)的简称&#xff0c;它是一种基于距离矢量(Distance-Vector)算法的协议&#xff0c;使用跳数作为度量来衡量到达目的网络的距离。RIP主要应用于规模较小的网络中。RIP是一种比较简单的…

android中可以有两个焦点吗,android – 如何通过焦点在屏幕上调整两个片段的大小?...

我有三个片段,前两个填充80&#xff05;的屏幕,最后一个填充其余的片段(这个片段永远不会改变大小).我希望,在用户(焦点)输入片段后,调整片段的大小,使其填满屏幕的70&#xff05;(将10&#xff05;留给另一个).像这样&#xff1a;可以通过动态改变碎片的重量吗&#xff1f;或者…