jax-rs jax-ws_通过JAX-WS Provider在Web服务中利用MOXy

jax-rs jax-ws

在以前的文章中,我演示了如何将EclipseLink JAXB(MOXy)直接集成到WebLogic(从12.1.1开始)和GlassFish(从3.1.2开始)的JAX-WS实现中 。 在本文中,我将演示如何通过使用JAX-WS Provider类在任何应用程序服务器中利用MOXy。

网络服务

JAX-WS中的提供机制为您提供了一种创建可直接访问XML的Web服务的方法。 通过@ServiceMode批注,您可以指定是要从消息中获取所有XML还是仅是负载。

FindCustomerService

所有的魔术都发生在invoke方法中。 由于我们将PAYLOAD指定为服务模式,因此输入将是表示消息正文的Source实例。 所有JAXB(JSR-222)实现都可以从Source解组,因此我们将这样做以实现请求。 在执行业务逻辑之后,我们需要将响应的正文作为Source的实例返回。 为此,我们将响应对象包装在JAXBSource的实例中。

package blog.jaxws.provider;import javax.xml.bind.*;
import javax.xml.bind.util.JAXBSource;
import javax.xml.transform.Source;
import javax.xml.ws.*;@ServiceMode(Service.Mode.PAYLOAD)
@WebServiceProvider(portName = 'FindCustomerPort', serviceName = 'FindCustomerService', targetNamespace = 'http://service.jaxws.blog/', wsdlLocation = 'WEB-INF/wsdl/FindCustomerService.wsdl')
public class FindCustomerService implements Provider<Source> {private JAXBContext jaxbContext;public FindCustomerService() {try {jaxbContext = JAXBContext.newInstance(FindCustomerResponse.class,FindCustomerRequest.class);} catch (JAXBException e) {throw new WebServiceException(e);}}@Overridepublic Source invoke(Source request) throws WebServiceException {try {Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();FindCustomerRequest fcRequest = (FindCustomerRequest) unmarshaller.unmarshal(request);Customer customer = new Customer();customer.setId(fcRequest.getArg0());customer.setFirstName('Jane');customer.setLastName('Doe');FindCustomerResponse response = new FindCustomerResponse();response.setValue(customer);return new JAXBSource(jaxbContext, response);} catch (JAXBException e) {throw new WebServiceException(e);}}}

MOXy作为JAXB提供者

要指定将MOXy用作JAXB提供程序,我们需要包含一个名为jaxb.properties的文件,该文件与我们的域模型位于同一包中,并带有以下条目(请参阅:将EclipseLink MOXy指定为JAXB Provider )。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

WSDL

以下是与我们的Web服务相对应的WSDL。 使用Provider方法的一个缺点是 JAX-WS实现无法自动为我们生成一个(请参阅: GlassFish 3.1.2充满了MOXy(EclipseLink JAXB) )。 WSDL是必需的,因为它为客户端定义了合同。 它甚至可以用于生成客户端。

<?xml version='1.0' encoding='UTF-8'?>
<definitions xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' xmlns:wsp='http://www.w3.org/ns/ws-policy' xmlns:wsp1_2='http://schemas.xmlsoap.org/ws/2004/09/policy' xmlns:wsam='http://www.w3.org/2007/05/addressing/metadata' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://service.jaxws.blog/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns='http://schemas.xmlsoap.org/wsdl/' targetNamespace='http://service.jaxws.blog/' name='FindCustomerService'><types><xsd:schema><xsd:import namespace='http://service.jaxws.blog/' schemaLocation='FindCustomerService.xsd'/></xsd:schema></types><message name='findCustomer'><part name='parameters' element='tns:findCustomer'/></message><message name='findCustomerResponse'><part name='parameters' element='tns:findCustomerResponse'/></message><portType name='FindCustomer'><operation name='findCustomer'><input wsam:Action='http://service.jaxws.blog/FindCustomer/findCustomerRequest' message='tns:findCustomer'/><output wsam:Action='http://service.jaxws.blog/FindCustomer/findCustomerResponse' message='tns:findCustomerResponse'/></operation></portType><binding name='FindCustomerPortBinding' type='tns:FindCustomer'><soap:binding transport='http://schemas.xmlsoap.org/soap/http' style='document'/><operation name='findCustomer'><soap:operation soapAction=''/><input><soap:body use='literal'/></input><output><soap:body use='literal'/></output></operation></binding><service name='FindCustomerService'><port name='FindCustomerPort' binding='tns:FindCustomerPortBinding'><soap:address location='http://localhost:8080/Blog-JAXWS/FindCustomerService'/></port></service>
</definitions>

XML模式

下面是对应于我们的消息有效负载的XML模式。 使用Provider方法的一个缺点是JAX-WS实现不能直接利用JAXB直接直接自动生成XML模式,因此我们需要提供一个。

<?xml version='1.0' encoding='UTF-8'?>
<xsd:schema xmlns:ns0='http://service.jaxws.blog/' xmlns:xsd='http://www.w3.org/2001/XMLSchema'targetNamespace='http://service.jaxws.blog/'><xsd:element name='findCustomerResponse' type='ns0:findCustomerResponse' /><xsd:complexType name='findCustomerResponse'><xsd:sequence><xsd:element name='return' type='ns0:customer'minOccurs='0' /></xsd:sequence></xsd:complexType><xsd:element name='findCustomer' type='ns0:findCustomer' /><xsd:complexType name='findCustomer'><xsd:sequence><xsd:element name='arg0' type='xsd:int' /></xsd:sequence></xsd:complexType><xsd:complexType name='customer'><xsd:sequence><xsd:element name='personal-info' minOccurs='0'><xsd:complexType><xsd:sequence><xsd:element name='first-name' type='xsd:string'minOccurs='0' /><xsd:element name='last-name'type='xsd:string'minOccurs='0' /></xsd:sequence></xsd:complexType></xsd:element></xsd:sequence><xsd:attribute name='id' type='xsd:int' use='required' /></xsd:complexType>
</xsd:schema>

请求对象

下面XML消息中突出显示的部分是我们将在Source中作为实例在Provider中接收的内容。 我们将创建一个JAXB模型来映射到此部分。

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S='http://schemas.xmlsoap.org/soap/envelope/'><S:Header/><S:Body><ns2:findCustomer xmlns:ns2='http://service.jaxws.blog/'><arg0>123</arg0></ns2:findCustomer></S:Body>
</S:Envelope>

FindCustomerRequest

根元素与主体的其余部分位于不同的XML名称空间中。 我们将利用@XmlRootElement批注指定名称空间(请参阅: JAXB&Namespaces )。

package blog.jaxws.provider;import javax.xml.bind.annotation.*;@XmlRootElement(namespace='http://service.jaxws.blog/', name='findCustomer')
public class FindCustomerRequest {private int arg0;public int getArg0() {return arg0;}public void setArg0(int arg0) {this.arg0 = arg0;}}

响应对象

下面XML消息中突出显示的部分是作为Source实例,我们将从Provider返回的内容。 我们将创建一个JAXB模型来映射到此部分。

<S:Envelope xmlns:S='http://schemas.xmlsoap.org/soap/envelope/'><S:Header /><S:Body><ns0:findCustomerResponse xmlns:ns0='http://service.jaxws.blog/'><return id='123'><personal-info><first-name>Jane</first-name><last-name>Doe</last-name></personal-info></return></ns0:findCustomerResponse></S:Body>
</S:Envelope>

FindCustomerResponse

package blog.jaxws.provider;import javax.xml.bind.annotation.*;@XmlRootElement(namespace='http://service.jaxws.blog/')
public class FindCustomerResponse {private Customer value;@XmlElement(name='return')public Customer getValue() {return value;}public void setValue(Customer value) {this.value = value;}}

顾客

使用MOXy的众多原因之一是其基于路径的映射(请参阅: 基于XPath的映射 )。 以下是使用@XmlPath批注指定方式的示例

package blog.jaxws.provider;import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;@XmlType(propOrder = { 'firstName', 'lastName' })
public class Customer {private int id;private String firstName;private String lastName;@XmlAttributepublic int getId() {return id;}public void setId(int id) {this.id = id;}@XmlPath('personal-info/first-name/text()')public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}@XmlPath('personal-info/last-name/text()')public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}}

参考: Java XML和JSON绑定博客中的JCG合作伙伴 Blaise Doughan 通过JAX-WS Provider在Web服务中利用MOXy 。

翻译自: https://www.javacodegeeks.com/2013/02/leveraging-moxy-in-your-web-service-via-jax-ws-provider.html

jax-rs jax-ws

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

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

相关文章

3个经常被忽略的APM关键功能

APM核心功能已不再足够。 市场领先的应用超越了以往&#xff0c;设置了其他人必须匹配的新标准。 每当任何针对消费者或企业的Web应用程序达到新的性能峰值时&#xff0c;都会为用户期望值设定基准。 这可能不公平或不合理&#xff0c;但这就是市场运作的方式。 当某人出于个…

NOIP模拟测试13「矩阵游戏·跳房子·优美序列」

矩阵游戏 考试时思路一度和正解一样&#xff0c;考试到最后还是打了80分思路&#xff0c;结果80分打炸了只得了40分暴力分 题解 算出来第一列的总值&#xff0c;每次通过加每两列之间的差值得出下一列的总值 算第一列我们只需要让当前点*行增倍的数量就行了 for(ll i1;i<n;i…

一次测试

$\leq$ $\in[x,y]$ 转载于:https://www.cnblogs.com/znsbc-13/p/11304153.html

java的xml面试题_Java程序员的10个XML面试问答

java的xml面试题XML面试问题在各种编程工作面试中非常受欢迎&#xff0c;包括针对Web开发人员的Java面试 。 XML是一项成熟的技术&#xff0c;通常用作从一个平台传输数据的标准。 XML面试问题包含来自各种XML技术&#xff08;例如XSLT&#xff09;的问题&#xff0c;该技术用于…

【chromium】 Chromium OS的oom机制

前一段时间&#xff0c;运行在Chromium OS上的一个相机应用经常会自己崩溃&#xff0c;进程戛然而止&#xff0c;测试过程中发现使用的内存以肉眼可见的内存增长&#xff0c;当增长到1G左右&#xff0c;应用窗口突然消失&#xff0c;虽然原因不明&#xff0c;但是能猜到个大概&…

了解java.nio.file.Path – 2

在本文的第1部分中&#xff0c;我们研究了java.nio.file.Path类中的大多数API。 在本文中&#xff0c;我们将介绍其余的API。 使用register&#xff08;&#xff09; 该API允许我们注册java.nio.file.WatchService接口的实现&#xff0c;该接口将侦听目录创建&#xff0c;修改…

欧几里德算法求最大公约数

在求两个数的最大公约数方法中&#xff0c; 辗转相除法是比较快的一种方法。 也就是著名的欧几里德方法。 View Code int Gcd(int a, int b){return b0?a:gcd(b, a%b); } View Code #include "iostream"#include "cstdio"#include "cstring"#…

__reduce__

一、__reduce__()介绍 当定义扩展类型时&#xff08;也就是使用Python的C语言API实现的类型&#xff09;&#xff0c;如果你想pickle它们&#xff0c;你必须告诉Python如何pickle它们。 __reduce__ 被定义之后&#xff0c;当对象被Pickle时就会被调用。它要么返回一个代表全局名…

camel.js_Camel 2.11 –具有URL重写功能的HTTP代理路由

camel.js在即将发布的Apache Camel 2.11版本中&#xff0c;我最近添加了对将自定义url重写实现插入基于HTTP的路由&#xff08;http&#xff0c;http4&#xff0c;jetty&#xff09;的支持。 当您使用骆驼代理/桥接HTTP路由时&#xff0c;这使人们可以控制url映射。 例如&…

问题 1044: [编程入门]三个字符串的排序

题目描述输入三个字符串&#xff0c;按由小到大的顺序输出输入3行字符串输出按照从小到大输出成3行样例输入cde afg abc样例输出abc afg cde分析&#xff1a;可以使用java自带方法compareTo()进行两两比较&#xff0c;首先输入三个字符串a,b,c用a和b比较&#xff0c;如果a的值比…

使用JUnit 5进行更清洁的参数化测试

参数化单元测试的总体思路是对不同的数据运行相同的测试方法。 在JUnit 4中创建参数化测试远非完美。 现有体系结构存在许多问题&#xff1a;将参数定义为类字段&#xff0c;并且需要使用构造函数来创建它们&#xff0c;不能将参数化和非参数化测试混合在一个测试类中&#xff…

问题 1045: [编程入门]自定义函数之整数处理

题目描述输入10个整数&#xff0c;将其中最小的数与第一个数对换&#xff0c;把最大的数与最后一个数对换。写三个函数&#xff1b; ①输入10个数&#xff1b;②进行处理&#xff1b;③输出10个数。输入10个整数输出整理后的十个数&#xff0c;每个数后跟一个空格&#xff08;注…

我曾经是怎么做面试官的

阅读提示 更新于2019年2月3日&#xff1a;本文过于注重技巧&#xff0c;很多内容笔者已不再使用。这是成长的必经过程&#xff0c;正如独孤求败的剑术精进之路&#xff0c;先注重技巧&#xff0c;再内化&#xff0c;变得不拘泥于形式。 纵然本文内容已不完全与笔者真正的面试风…

大数据摄取:Flume,Kafka和NiFi

初赛 在构建大数据管道时&#xff0c;我们需要考虑如何吸收出现在通常是Hadoop生态系统大门口的数据量&#xff0c;多样性和速度。 在决定采用哪种工具来满足我们的要求时&#xff0c;诸如可伸缩性&#xff0c;可靠性&#xff0c;适应性&#xff0c;开发时间成本等方面的初步考…

__repr__

class Item: def __init__ (self, name, price): self.name name self.price price # 创建一个Item对象&#xff0c;将之赋给im变量 im Item(鼠标, 29.8) # 打印im所引用的Item对象 print(im) 先看下面程序&#xff1a; 上面程序创建了一个 Item 对象&#xff0c;然后使用 p…

__getattribute__

在类 里面,其实并没有方法这个东西,所有的东西都保存在属性里面,所谓的调用方法其实是类里面的一个同名属性指向了一个函数(方法),返回的是函数的引用,再用 函数() 这种方式就可以调用它 在调用实例的方法的时候,实际上给对象传过去的只是一个字符串而已, 比如 t Test()…

使用精确的Java方法参数

了解如何在Java应用程序中选择正确的方法参数类型并获得更健壮和更短的代码。 我们Java开发人员通常有一个使用方法参数的坏习惯&#xff0c;即不考虑实际需要什么&#xff0c;而只是选择我们习惯的&#xff0c;可用的或首先想到的东西。 考虑以下代表性示例&#xff1a; pri…

Android external storage

File sdCard Environment.getExternalStorageDirectory(); File directory_pictures new File(sdCard, "Pictures"); Log.i(TAG,"directory_pictures"directory_pictures); 存储在external storage 这类文件不应该存在SD卡的根目录下&#xff0c;而应该存…

EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换

目录 1. 数据转换概念2. 数据智能感知 - DataSense3. 简单数据转换组件3.1 Object to JSON3.2 JSON to XML3.3 JSON to Object3.4 XML to JSON4. 企业版的DataWeave Transformer(可视化高级数据转换器)5. 社区版的InfoMapper(自研的可视化数据转换器)本篇主要介绍在Mule ESB中使…

反射和内省_单例设计模式–内省和最佳实践

反射和内省定义&#xff1a; Singleton是“ 四人帮”设计模式的一部分&#xff0c;它属于创新设计模式。 在本文中&#xff0c;我们将更深入地研究Singleton模式的用法。 就建模而言&#xff0c;它是最简单的设计模式之一&#xff0c;但另一方面&#xff0c;就使用的复杂性而言…