接上文JAX-WS:创建简单的webservice,JAX-WS对大部分复杂对象传递都能直接支持。在服务端传递了自定义的复杂对象Person:
public class Person implements Serializable {
private static final long serialVersionUID = 8336803120311071811L;
private String username;
private Date birthday;
private List<Address> addresses;
//getter/setter
我们来看看根据wsimport生产的客户端中Person的定义:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "person", propOrder = {
"addresses",
"birthday",
"username"
})
public class Person {
@XmlElement(nillable = true)
protected List<Address> addresses;
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar birthday;
protected String username;
//getter/setter
}
在生产的客户端代码中多了很多annotation声明,在前面也说了JAX-WS是一种基于xml传递的webservice,也就是需要将传递的参数转化为xml文档,而这其中转化的过程就是我们见到的客户端对象中各种annotation声明,其背后的技术也就是前面说的JAXB(Java Architecture for XML Binding)简单地说就是一种将JAVA对象和XML互相转换的技术。包含在包
javax.jws
javax.xml.bind下提供了一系列解组、编组已经运行时绑定的API
javax.xml.bind.annotation 定义将 Java 程序元素定制成XML模式映射的注释
javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用
----------------------------------------
主要的接口或类:
HandlerChain 将 Web Service 与外部定义的处理程序链关联。
Oneway 指示给定 @WebMethod 只有一条输入消息并且没有输出。
WebMethod 定制一个公开为 Web Service 操作的方法。
WebParam 定制单个参数到 Web Service 消息部分和 XML 元素的映射关系。
WebResult 定制返回值到 WSDL 部分和 XML 元素的映射关系。
WebService 将 Java 类标记为实现 Web Service,或者将 Java 接口标记为定义 Web Service 接口。
Element 这是一个元素标记接口。
Marshaller Marshaller 类负责管理将 Java 内容树序列化回 XML 数据的过程。
Unmarshaller Unmarshaller 类管理将 XML 数据反序列化为新创建的 Java 内容树的过程,并可在解组时有选择地验证 XML 数据。
UnmarshallerHandler 作为 SAX ContentHandler 实现的 Unmarshaller。
ValidationEvent此事件指示在执行解组操作期间验证传入的 XML 数据时、对 Java 内容树执行按需验证时或将 Java 内容树编组回 XML 数据时遇到问题。
DatatypeConverter可以使用 javaType 绑定声明来自定义 XML 模式数据类型到 Java 数据类型的绑定。
JAXBContext JAXBContext 类提供到 JAXB API 的客户端入口点。
XmlAdapter 修改 Java 类型以适应自定义编组
主要的Annotation
XmlAccessorOrder 控制类中字段和属性的排序。
XmlAccessorType 控制默认情况下是否对字段或 Javabean 属性进行系列化。
XmlAttribute 将 JavaBean 属性映射到 XML 属性。
XmlElement 将 JavaBean 属性映射到派生于属性名称的 XML 元素。
XmlElementWrapper 生成一个包装 XML 表示形式的包装器元素。
XmlList 用来将属性映射到列表简单类型。
XmlMimeType 关联控制属性 XML 表示形式的 MIME 类型。
XmlRootElement 将类或枚举类型映射到 XML 元素。
XmlTransient 阻止将 JavaBean 属性映射到 XML 表示形式。
XmlType 将类或枚举类型映射到 XML 模式类型。
XmlValue 支持将类映射到带有 simpleContent 的 XML 模式复杂类型或 XML 模式简单类型。
1、如何解码转码
JAXBContext是JAXB API 的客户端入口,从java到xml的互相转换对应Marshaller和Unmarshaller。一个简单的例子是
JAXBContext jaxbContext = JAXBContext.newInstance(claszz);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://sws.org/sample");
marshaller.marshal(t, System.out);
marshaller.marshal(t, new File("c:\\t.xml"));
这里只是java转xml的例子。设置了格式化输出、encoding等属性、schema等信息,同时输出到控制台和指定文件路径
2、常用annotation
常用的annotation用来绑定转换运行过程中的各种属性,如绑定属性、绑定的顺序、格式化处理等。下面介绍一些常用
@XmlRootElement(name="",namespace="")
标注此类作为xml的一个root节点,常用在顶层类或枚举类型。以下注释一起使用: XmlType、XmlEnum、XmlAccessorType、 XmlAccessorOrder。作为生产xml的root节点,名称可通过name来指定,默认会为该类名
@XmlAccessorType(XmlAccessType.FIELD)
控制对JavaBean的访问方式,一般有PROPERTY(getter/setter)、FIELD,PUBLIC_MEMBER(public getter/setter,fileds)、NONE可用于包,顶层类。若用于包表示该包下所有的类都照此处理,顶层类也即如果该类有其他的实体也将照此处理
默认为@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
指定序列化javabean的顺序
@XmlElement
@XmlElement 注释可以与以下程序元素一起使用: JavaBean 属性 ,非 static、非 transient 字段 ,XmlElements 中的程序元素
@XmlElement(name = "firstName")
private String name;
private int age;
如果顶层类中标志了访问类型,如Filed。那么各个fileds的名称会被处理为xml中的节点,若按照上面的标注,此时节点名会是firstName
<firstName>nico</firstName>
<age>20</age>
@XmlTransient
@XmlTransient 注释对于解决 JavaBean 属性名称与字段名称之间的名称冲突,或者用于防止字段/属性的映射。
@XmlTransient
private String lastName;
则lastName不会被映射
@XmlList
@XmlList 来将属性映射到列表简单类型。比较两种序列方式:
List<String> data;
<foo><data>aaaa</data><data>bbbb</data></foo>
@XmlList
List<String> data;
<foo><data>aaaa bbbb</data></foo>
@XmlJavaTypeAdapter(class)
用来描述自定义的adapter,需要继承XmlAdapter,用来对自定义序列化的格式。如我们对时间的格式化输出
@XmlValue
支持将类映射到带有 simpleContent 的 XML 模式复杂类型或 XML 模式简单类型。 简单说就是可以指定格式
<msg name="name">robin</msg>
下面是一个Person的javabean,包含了一系列的声明:
@XmlRootElement(name = "per")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class Person {
@XmlElement(name = "firstName")
private String name;
@XmlTransient
private String lastName;
@XmlJavaTypeAdapter(value = DateXmlAdapter.class)
private Date birthDay;
@XmlList
private List<String> lang;
private List<KeyValue> msg;
//getter/setter
}
其中DateXmlAdapter如下:
public class DateXmlAdapter extends XmlAdapter<String, Date> {
@Override
public String marshal(Date v) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
return format.format(v);
}
@Override
public Date unmarshal(String v) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
return format.parse(v);
}
}
KeyValue:
@XmlAccessorType(XmlAccessType.FIELD)
public class KeyValue {
@XmlAttribute
private String name;
@XmlValue
private String value;
序列化结果为:
Person p = new Person();
p.setName("robin");
p.setLastName("yang");
p.setBirthDay(new Date());
List<String> lang = Arrays.asList(new String[] { "java", "javascript", "python" });
p.setLang(lang);
List<KeyValue> msg = new ArrayList<KeyValue>();
msg.add(new KeyValue("aa", "aaa-value"));
msg.add(new KeyValue("bbb", "bbb-value"));
p.setMsg(msg);
<per>
<birthDay>2012-11-17</birthDay>
<lang>java javascript python</lang>
<msg name="aa">aaa-value</msg>
<msg name="bbb">bbb-value</msg>
<firstName>robin</firstName>
</per>
3、JAX-WS传递Map
前面在说到可以传递复杂对象时并没有指定Map,是因为并不支持原生的Map传递。如果需要传递我们需要做一个简单的包装,同时需要利用到上面说的XmlJavaTypeAdapter来对bean到xml转换转换。下面的例子是传递Map实例:
@WebService
public interface JaxWsMapService {
@WebMethod
public WrapperMapResult getPersonMap();
}
WrapperMapResult 只是对Map的一个简单封装:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class WrapperMapResult {
private String message;
private boolean success;
@XmlJavaTypeAdapter(value = MapAdapter.class)
private Map<String, Person> map;
其中最重要的是MapAdapter:
public class MapAdapter extends XmlAdapter<MapConvertor, Map<String, Person>> {
@Override
public Map<String, Person> unmarshal(MapConvertor convertor) throws Exception {
List<MapEntry> entries = convertor.getEntries();
if (entries != null && entries.size() > 0) {
Map<String, Person> map = new HashMap<String, Person>();
for (MapEntry mapEntry : entries) {
map.put(mapEntry.getKey(), mapEntry.getValue());
}
return map;
}
return null;
}
@Override
public MapConvertor marshal(Map<String, Person> map) throws Exception {
MapConvertor convertor = new MapConvertor();
for (Map.Entry<String, Person> entry : map.entrySet()) {
convertor.addEntry(new MapConvertor.MapEntry(entry));
}
return convertor;
}
}
这里声明了MapConvertor用来解析Map<String, Person>
@XmlType(name="MapConvertor")
@XmlAccessorType(XmlAccessType.FIELD)
public class MapConvertor {
private List<MapEntry> entries = new ArrayList<MapConvertor.MapEntry>();
public void addEntry(MapEntry entry) {
entries.add(entry);
}
public List<MapEntry> getEntries() {
return entries;
}
//结构依赖于需要Conver的Map,比如这里Map<String, Person>
public static class MapEntry {
private String key;
private Person value;
public MapEntry() {
}
public MapEntry(String key, Person person) {
this.key = key;
this.value = person;
}
public MapEntry(Map.Entry<String, Person> entry) {
this.key = entry.getKey();
this.value = entry.getValue();
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Person getValue() {
return value;
}
public void setValue(Person value) {
this.value = value;
}
}
}
其他的步骤按照wsimport生产客户端代码调用即可,这样就完成了JAX-WS中map的传递
分享到:
相关推荐
Apache CXF入门范例以及对传递ListMap类型的疑惑】中,可能会详细解释如何创建和调用一个使用CXF的Web服务,同时也可能讨论了在处理复杂数据类型如List<Map, Object>>时遇到的问题和解决方案。通常,CXF允许你通过...
- **更强大更简单的 JAX-WS**:提供了更高级别的 Web 服务支持。 #### 八、JDK 1.7 新特性 - **switch 中使用字符串**:允许在 switch 语句中使用字符串。 - **泛型实例化类型自动推断**:简化了泛型的使用。 - **...
风光储直流微电网Simulink仿真模型:光伏发电、风力发电与混合储能系统的协同运作及并网逆变器VSR的研究,风光储直流微电网Simulink仿真模型:MPPT控制、混合储能系统、VSR并网逆变器的设计与实现,风光储、风光储并网直流微电网simulink仿真模型。 系统由光伏发电系统、风力发电系统、混合储能系统(可单独储能系统)、逆变器VSR?大电网构成。 光伏系统采用扰动观察法实现mppt控制,经过boost电路并入母线; 风机采用最佳叶尖速比实现mppt控制,风力发电系统中pmsg采用零d轴控制实现功率输出,通过三相电压型pwm变器整流并入母线; 混合储能由蓄电池和超级电容构成,通过双向DCDC变器并入母线,并采用低通滤波器实现功率分配,超级电容响应高频功率分量,蓄电池响应低频功率分量,有限抑制系统中功率波动,且符合储能的各自特性。 并网逆变器VSR采用PQ控制实现功率入网。 ,风光储; 直流微电网; simulink仿真模型; 光伏发电系统; 最佳叶尖速比控制; MPPT控制; Boost电路; 三相电压型PWM变换器;
以下是针对初学者的 **51单片机入门教程**,内容涵盖基础概念、开发环境搭建、编程实践及常见应用示例,帮助你快速上手。
【Python毕设】根据你提供的课程代码,自动排出可行课表,适用于西工大选课_pgj
【毕业设计】[零食商贩]-基于vue全家桶+koa2+sequelize+mysql搭建的移动商城应用
电动汽车充电背景下的微电网谐波抑制策略与风力发电系统仿真研究,电动汽车充电微电网的谐波抑制策略与风力发电系统仿真研究,基于电动汽车充电的微电网谐波抑制策略研究,包括电动汽车充电负 载模型,风电模型,光伏发现系统,储能系统,以及谐波处理模块 风力发电系统仿真 ,电动汽车充电负载模型; 风电模型; 光伏发现系统; 储能系统; 谐波处理模块; 风力发电系统仿真,电动汽车充电微电网的谐波抑制策略研究:整合负载模型、风电模型与光伏储能系统
Vscode部署本地Deepseek的continue插件windows版本
内容概要:本文详细介绍了滤波器的两个关键参数——截止频率(F0)和品质因素(Q),并探讨了不同类型的滤波器(包括低通、高通、带通和带阻滤波器)的设计方法及其特性。文章首先明确了F0和Q的基本概念及其在滤波器性能中的作用,接着通过数学推导和图形展示的方式,解释了不同Q值对滤波器频率响应的影响。文中特别指出,通过调整Q值可以控制滤波器的峰谷效果和滚降速度,进而优化系统的滤波性能。此外,还讨论了不同类型滤波器的具体应用场景,如低通滤波器适用于消除高频噪声,高通滤波器用于去除直流分量和低频干扰,而带通滤波器和带阻滤波器分别用于选取特定频段信号和排除不需要的频段。最后,通过对具体案例的解析,帮助读者更好地理解和应用相关理论。 适合人群:电子工程及相关领域的技术人员、研究人员以及高校学生,特别是那些需要深入了解滤波器设计原理的人群。 使用场景及目标:适用于从事模拟电路设计的专业人士,尤其是希望掌握滤波器设计细节和技术的应用场合。目标是让读者能够灵活运用Q值和F0来优化滤波器设计,提升系统的信噪比和选择性,确保信号的纯净性和完整性。
内容概要:本文主要讲述了利用QUARTUSⅡ进行电子设计自动化的具体步骤和实例操作,详细介绍了如何利用EDA技术在QUARTUSⅡ环境中设计并模拟下降沿D触发器的工作过程,重点探讨了系统规格设计、功能描述、设计处理、器件编译和测试四个步骤及相关的设计验证流程,如功能仿真、逻辑综合及时序仿真等内容,并通过具体的操作指南展示了电路设计的实际操作方法。此外还强调了QUARTUSⅡ作为一款集成了多种功能的综合平台的优势及其对于提高工作效率的重要性。 适用人群:电子工程、自动化等相关专业的学生或者工程师,尤其适用于初次接触EDA技术和QuartusⅡ的用户。 使用场景及目标:旨在帮助用户理解和掌握使用QUARTUSⅡ这一先进的EDA工具软件进行从概念设计到最后成品制作整个电路设计过程的方法和技巧。目标是在实际工作中能够熟练运用QUARTUSⅡ完成各类复杂电子系统的高效设计。 其他说明:文中通过具体的案例让读者更直观理解EDA设计理念和技术特点的同时也为进一步探索EDA领域的前沿课题打下了良好基础。此外它还提到了未来可能的发展方向,比如EDA工具的功能增强趋势等。
Simulink建模下的光储系统与IEEE33节点配电网的协同并网运行:光照强度变化下的储能系统优化策略与输出性能分析,Simulink模型下的光伏微网系统:光储协同,实现380v电压等级下的恒定功率并网与平抑波动,Simulink含光伏的IEEE33节点配电网模型 微网,光储系统并网运行 光照强度发生改变时,储能可以有效配合光伏进行恒定功率并网,平抑波动,实现削峰填谷。 总的输出有功为270kw(图23) 无功为0 检验可以并网到电压等级为380v的电网上 逆变侧输出电压电流稳定(图4) ,Simulink; 含光伏; 配电网模型; 微网; 光储系统; 储能配合; 恒定功率并网; 电压等级; 逆变侧输出。,Simulink光伏微网模型:光储协同并网运行,实现功率稳定输出
基于Andres ELeon新法的双馈风机次同步振荡抑制策略:附加阻尼控制(SDC)的实践与应用,双馈风机次同步振荡的抑制策略研究:基于转子侧附加阻尼控制(SDC)的应用与效能分析,双馈风机次同步振荡抑制策略(一) 含 基于转子侧附加阻尼控制(SDC)的双馈风机次同步振荡抑制,不懂就问, 附加阻尼控制 (SDC)被添加到 RSC 内部控制器的q轴输出中。 这种方法是由Andres ELeon在2016年提出的。 该方法由增益、超前滞后补偿器和带通滤波器组成。 采用实测的有功功率作为输入信号。 有关更多信息,你可以阅读 Andres ELeon 的lunwen。 附lunwen ,关键词:双馈风机、次同步振荡、抑制策略;转子侧附加阻尼控制(SDC);RSC内部控制器;Andres ELeon;增益;超前滞后补偿器;带通滤波器;实测有功功率。,双馈风机次同步振荡抑制技术:基于SDC与RSCq轴控制的策略研究
springboot疫情防控期间某村外出务工人员信息管理系统--
高效光伏并网发电系统MATLAB Simulink仿真设计与MPPT技术应用及PI调节闭环控制,光伏并网发电系统MATLAB Simulink仿真设计:涵盖电池、BOOST电路、逆变电路及MPPT技术效率提升,光伏并网发电系统MATLAB Simulink仿真设计。 该仿真包括电池,BOOST升压电路,单相全桥逆变电路,电压电流双闭环控制部分;应用MPPT技术,提高光伏发电的利用效率。 采用PI调节方式进行闭环控制,SPWM调制,采用定步长扰动观测法,对最大功率点进行跟踪,可以很好的提高发电效率和实现并网要求。 ,光伏并网发电系统; MATLAB Simulink仿真设计; 电池; BOOST升压电路; 单相全桥逆变电路; 电压电流双闭环控制; MPPT技术; PI调节方式; SPWM调制; 定步长扰动观测法。,光伏并网发电系统Simulink仿真设计:高效MPPT与PI调节控制策略
PFC 6.0高效循环加载系统:支持半正弦、半余弦及多级变荷载功能,PFC 6.0循环加载代码:支持半正弦、半余弦及多级变荷载的强大功能,PFC6.0循环加载代码,支持半正弦,半余弦函数加载,中间变荷载等。 多级加载 ,PFC6.0; 循环加载代码; 半正弦/半余弦函数加载; 中间变荷载; 多级加载,PFC6.0多级半正弦半余弦循环加载系统
某站1K的校园跑腿小程序 多校园版二手市场校园圈子失物招领 食堂/快递代拿代买跑腿 多校版本,多模块,适合跑腿,外卖,表白,二手,快递等校园服务 需要自己准备好后台的服务器,已认证的小程序,备案的域名!
【Python毕设】根据你提供的课程代码,自动排出可行课表,适用于西工大选课
COMSOL锂枝晶模型:五合一的相场、浓度场与电场模拟研究,涵盖单枝晶定向生长、多枝晶生长及无序生长等多元现象的探索,COMSOL锂枝晶模型深度解析:五合一技术揭示单枝晶至雪花枝晶的生长机制与物理场影响,comsol锂枝晶模型 五合一 单枝晶定向生长、多枝晶定向生长、多枝晶随机生长、无序生长随机形核以及雪花枝晶,包含相场、浓度场和电场三种物理场(雪花枝晶除外),其中单枝晶定向生长另外包含对应的参考文献。 ,comsol锂枝晶模型; 五合一模型; 单枝晶定向生长; 多枝晶定向生长; 多枝晶随机生长; 无序生长随机形核; 雪花枝晶; 相场、浓度场、电场物理场; 参考文献,COMSOL锂枝晶模型:多场景定向生长与相场电场分析
嵌入式大学生 点阵代码
那个有delphi12 tedgebrowser 使用的dll