8

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

char gender = 'M';

编组后翻译成:

<gender>77</gender>

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

4

5 回答 5

6

经过一些实验,似乎没有办法配置 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 字段更改为字符串,这就是我所拥有的。

于 2009-09-24T12:06:11.397 回答
4
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)

这就是指定类型以使其与原语一起使用的技巧

在您的适配器中

在 package-info 中使用相同的内容意味着您在全局范围内为该包执行此操作

实验后发现这个。

public class MyAdapter extends XmlAdapter<String, Integer> {
于 2011-05-30T23:53:43.993 回答
2

我想到的第一件事:)

String gender = "M";
于 2009-09-23T16:47:29.250 回答
1

这似乎仍然是 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
于 2010-07-06T13:15:46.523 回答
0

创建一个专门的 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

于 2010-08-14T00:01:56.523 回答