我正在使用 JAXB 开展一个项目,但在 JAXB 和 char 数据类型方面遇到了一个小问题。
char gender = 'M';
编组后翻译成:
<gender>77</gender>
所以我认为 char 映射到整数,但我只是想将它映射到字符串。我怎样才能做到这一点?甚至可能吗?
我正在使用 JAXB 开展一个项目,但在 JAXB 和 char 数据类型方面遇到了一个小问题。
char gender = 'M';
编组后翻译成:
<gender>77</gender>
所以我认为 char 映射到整数,但我只是想将它映射到字符串。我怎样才能做到这一点?甚至可能吗?
经过一些实验,似乎没有办法配置 JAXB 来正确处理原始字符。不过,我很难接受。
我已经尝试定义 anXmlAdaptor
来尝试将其强制转换为字符串,但运行时似乎只接受在 Object 类型上注释的适配器,而不是原语。
我能想到的唯一解决方法是用 标记 char 字段@XmlTransient
,然后编写获取并将值设置为字符串的 getter 和 setter:
@XmlTransient
char gender = 'M';
@XmlElement(name="gender")
public void setGenderAsString(String gender) {
this.gender = gender.charAt(0);
}
public String getGenderAsString() {
return String.valueOf(gender);
}
不是很好,我同意你,但实际上没有将你的 char 字段更改为字符串,这就是我所拥有的。
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)
这就是指定类型以使其与原语一起使用的技巧
在您的适配器中
在 package-info 中使用相同的内容意味着您在全局范围内为该包执行此操作
实验后发现这个。
public class MyAdapter extends XmlAdapter<String, Integer> {
我想到的第一件事:)
String gender = "M";
这似乎仍然是 Metro JAXB(RI)中的一个问题,至少是 JDK 1.6.0_20 附带的 Metro 版本。
EclipseLink JAXB (MOXy) 正确编组字符:
要使用 EclipseLink JAXB,只需将 eclipselink.jar 添加到类路径中,并在模型类中添加一个 jaxb.properties 文件,其中包含以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
创建一个专门的 XmlAdapter:
package br.com.maritima.util;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class CharAdapter extends XmlAdapter<String,Character>{
@Override
public String marshal(Character v) throws Exception {
return new String(new char[]{v});
}
@Override
public Character unmarshal(String v) throws Exception {
if(v.length()>0)
return v.charAt(0);
else return ' ';
}
}
然后您可以使用 package-info.java 将其注册到整个包中(避免在其他类中忘记它)或专门用于某个字段。
有关更多信息,请参阅http://blogs.oracle.com/CoreJavaTechTips/entry/exchangeing_data_with_xml_and 。