如何指定JAXB用于编组/解组数据的适配器?
有没有办法指定JAXB用于在我的XML模式中封送/解组对象的适配器?
例如,如果我想将以下内容解析为整数:
0x1234
我可以在我的架构中使用以下内容:
当我通过XJC工具运行模式时,字符串“0x1234”应使用Integer.decode()作为整数进行解码,其值为0x1234或十进制为4660。 生成的Adapter类正确反映了这一点:
public Integer unmarshal(String value) { return (Integer.decode(value)); }
但是,当我想将值封送回XML元素(String字面值)时,Adapter类执行以下操作:
public String marshal(Integer value) { if (value == null) { return null; } return value.toString(); }
在这种情况下,整数0x1234(十进制为4660)的字符串值为“4660”,这不符合我的模式(因为它没有“0x”前缀)。
如何告诉适配器我希望整数0x1234被编组为“0x1234”字符串文字? 我希望能够在模式中执行此操作,以便我可以生成新的Java类而无需修改输出。 这可能吗?
编辑:根据接受的答案,这是我做的工作:
我在com.example.Parse类中编写了一个名为toHexString()的方法:
public static String toHexString(int value) { return ("0x" + Integer.toHexString(value)); }
然后我将我的架构指向该方法进行打印:
尝试这个
我没有测试过,但我记得使用过非常类似的东西。
非常相似的问题:“如何将字符串坐标映射到java.awt.Point?”
(0)架构
(1)创建扩展XmlAdapter的适配器类。
package com.kjcode.hexgrid.jaxbadapter; import java.awt.Point; import javax.xml.bind.annotation.adapters.XmlAdapter; public class PointAdapter extends XmlAdapter { @Override public Point unmarshal(String v) throws Exception { String[] coords = v.split(","); return new Point(Integer.parseInt(coords[0]), Integer.parseInt(coords[1])); } @Override public String marshal(Point v) throws Exception { return String.format("%d,%d", vx, vy); } }
(2)创建绑定文件。 关键是添加:jaxb:extensionBindingPrefixes =“xjc”xmlns:xjc =“http://java.sun.com/xml/ns/jaxb/xjc”
(3)配置pom.xml
com.sun.tools.xjc.maven2 maven-jaxb-plugin 1.1.1 generate com.kjcode.hexmap.api.logic.field.generated true
(4)JAXB将生成
public class HexAreaBorder { @XmlElement(required = true) protected String type; @XmlElement(required = true) protected String name; @XmlElement(required = true, type = String.class) @XmlJavaTypeAdapter(PointAdapter.class) protected List points = new LinkedList ();
你想要一个自定义适配器。 这是一篇处理自定义布尔结果的post,但也可以应用于您的场景。
另外,这里是JAXB的XmlAdapter的API文档: http ://jaxb.java.net/nonav/2.1/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html
希望这可以帮助!