我正在使用 JAXB 开发一个项目,但遇到了 JAXB 和 char 数据类型的小问题。

char gender = 'M';

编组后翻译为:

<gender>77</gender>

所以我认为 char 映射到整数,但我只想将它映射到字符串。我怎样才能做到这一点?有可能吗?

有帮助吗?

解决方案

一些实验后,有似乎没有办法来配置JAXB妥善处理原始字符。我有一个难以接受,虽然。

我试过定义XmlAdaptor尝试它强制为String,但运行时似乎只接受注释的对象类型,不是基本类型的适配器。

我能想到的唯一的解决方法是标记与@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);
   }

不是很漂亮,我会给予你的,但短期的实际改变你的焦炭领域砥一个字符串,这就是我的一切。

其他提示

@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)

那特技指定型,使其与基元的工作

在适配器

在包信息使用相同的将意味着你的那个包做全球

试验后发现这一点。

public class MyAdapter extends XmlAdapter<String, Integer> {

我第一件事在我脑海里了:)

String gender = "M";

这在 Metro JAXB(RI)中似乎仍然是一个问题,至少在 JDK 1.6.0_20 附带的 Metro 版本中是这样。

EclipseLink JAXB (MOXy) 正确封送 char:

要使用 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/exchanging_data_with_xml_and 对于更多的信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top