【问题标题】:Java: JAXB and using charJava:JAXB 和使用 char
【发布时间】:2010-11-30 18:12:12
【问题描述】:

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

char gender = 'M';

编组后翻译成:

<gender>77</gender>

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

【问题讨论】:

  • 不要将性别存储为字符,而是使用enum。它不仅类型更安全,而且您还可以根据需要映射它;-)
  • @Joachim Sauer:你说得对,枚举是存储性别的更好选择。但我正在探索 JAXB 的可能性。而且我很固执,所以我只是认为必须有一个使用 char 的解决方案:-p
  • 这是 JAXB (Metro) 的一个特定实现中的一个错误,JAXB (EclipseLink MOXy) 的其他实现正确地编组字符。

标签: java jaxb char primitive java-metro-framework


【解决方案1】:

创建一个专门的 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 了解更多信息。

【讨论】:

  • 我很好奇,为什么用new String(new char[]{v}) 而不是v.toString()
【解决方案2】:
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)

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

在您的适配器中

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

实验后发现。

public class MyAdapter extends XmlAdapter<String, Integer> {

【讨论】:

    【解决方案3】:

    这似乎仍然是 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
    

    【讨论】:

      【解决方案4】:

      经过一些实验,似乎无法配置 JAXB 以正确处理原始字符。不过,我很难接受。

      我已经尝试定义一个XmlAdaptor 来尝试将其强制转换为字符串,但运行时似乎只接受在对象类型上注释的适配器,而不是原语。

      我能想到的唯一解决方法是用@XmlTransient 标记char 字段,然后编写getter 和setter,将值获取和设置为String:

         @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 字段更改为字符串,这就是我所拥有的。

      【讨论】:

      • 此问题与 JAXB 的 Metro 实现特别相关,其他 JAXB 实现 (EclipseLink MOXy) 正确处理此用例。
      【解决方案5】:

      我想到的第一件事:)

      String gender = "M";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-27
        • 2021-09-22
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 2013-03-20
        • 2012-10-04
        • 1970-01-01
        相关资源
        最近更新 更多