对于如何根据我的要求使用JAXB XML Adapter感到困惑
发布时间:2020-12-16 07:49:40 所属栏目:百科 来源:网络整理
导读:我正在使用JAXB进行解组过程,请求来自UI到我们的服务类.以下是 XML请求的格式. SampleRequest user="testUser" account="testAccount" Specifier= "value1a,value1b,value1c : name2a,value2b,value2c"/ 我的要求是,Specifier属性有多个值系列(:冒号分隔)我
我正在使用JAXB进行解组过程,请求来自UI到我们的服务类.以下是
XML请求的格式.
<SampleRequest user="testUser" account="testAccount" Specifier= "value1a,value1b,value1c : name2a,value2b,value2c"/> 我的要求是,Specifier属性有多个值系列(:冒号分隔)我需要将每个值系列映射到我的自定义java类 我试过这种方式 @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class SampleRequest { @XmlAttribute private String user; @XmlAttribute private String account; @XmlAttribute(name="Specifier") private List<Specifier> specifier; } Specifier.java @XmlJavaTypeAdapter(SpecifierAdapter.class) public class Specifier { } SpecifierAdapter.java public class SpecifierAdapter extends XmlAdapter{ @Override public Object marshal(Object arg0) throws Exception { // TODO Auto-generated method stub return null; } @Override public Object unmarshal(Object arg0) throws Exception { // TODO Auto-generated method stub return null; } } 编辑部分 类Specifier有3个String属性. class Specifier { String value1; String value2; String value3; } 我需要每个系列的Specifier例如(value1a,value1c)应分别映射到value1,value2,value3 编辑第3部分 嗨, 这是我通过的要求 <sampleRequest user="user" account="account" Specifier="v1,v2,v3 : a1,a2,a3"/> 只是想确保,我的Specifier类是否正确? (因为我这里没有使用任何注释) package com; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlJavaTypeAdapter(SpecifierAdapter.class) public class Specifier { Specifier(String v1,String v2,String v3) { } String value1; public String getValue1() { return value1; } public void setValue1(String value1) { this.value1 = value1; } public String getValue2() { return value2; } public void setValue2(String value2) { this.value2 = value2; } public String getValue3() { return value3; } public void setValue3(String value3) { this.value3 = value3; } String value2; String value3; }
注意:使用guava-library的
Joiner and Splitter可以使适配器代码更简单.
SampleRequest public class SampleRequest { @XmlAttribute private String user; @XmlAttribute private String account; @XmlAttribute(name = "Specifier") @XmlJavaTypeAdapter(SpecifierAdapter.class) private List<Specifier> specifier; } 适配器 public class SpecifierAdapter extends XmlAdapter<String,List<Specifier>> { @Override public List<Specifier> unmarshal(final String v) throws Exception { String[] values = v.split(":"); List<Specifier> l = new ArrayList<Specifier>(); for (String s : values) { String[] vs = s.split(","); l.add(new Specifier(vs[0],vs[1],vs[2])); } return l; } @Override public String marshal(final List<Specifier> v) throws Exception { String values = ""; for (Specifier s : v) { values += s.getValue1() + "," + s.getValue2() + "," + s.getValue3() + " : "; } return values.length() > 0 ? values.substring(0,values.length() - 3) : values; } } 用法 public static void main(final String a[]) throws JAXBException { SampleRequest r = new SampleRequest(); r.setAccount("account"); r.setUser("user"); List<Specifier> sps = new ArrayList<Specifier>(); sps.add(new Specifier("v1","v2","v3")); sps.add(new Specifier("a1","a2","a3")); r.setSpecifier(sps); JAXBContext jc = JAXBContext.newInstance(SampleRequest.class); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true); marshaller.marshal(r,System.out); } 产量 <?xml version="1.0" encoding="UTF-8"?> <sampleRequest user="user" account="account" Specifier="v1,a3"/> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |