27

有一个快速的问题。有谁知道如何让 JAXB (marshall) 将布尔字段呈现为 1 和 0 而不是打印出“true”和“false”?

4

5 回答 5

42

适配器类:

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class BooleanAdapter extends XmlAdapter<Integer, Boolean>
{
    @Override
    public Boolean unmarshal( Integer s )
    {
        return s == null ? null : s == 1;
    }

    @Override
    public Integer marshal( Boolean c )
    {
        return c == null ? null : c ? 1 : 0;
    }
}

用法:

@XmlElement( name = "enabled" )
@XmlJavaTypeAdapter( BooleanAdapter.class )
public Boolean getEnabled()
{
    return enabled;
}
于 2009-10-27T19:07:40.517 回答
7

遇到与 user20298 相同的问题,我按照 mtpettyp 的提示进行了调整,并针对我的配置进行了调整。

我的配置是: - maven 来构建项目。- maven 中的“org.jvnet.jaxb2.maven2”插件。- jaxb 2.2.6 - 在这个场合,我正在为 kml 2.2 (ogckml22.xsd) 制作 Java 类

我偶然发现布尔值被渲染为“真/假”的问题,当谷歌地图希望它们为“1/0”时

这是maven中的插件配置:

<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
    <execution>
        <phase>generate-sources</phase>
        <goals>
            <goal>generate</goal>
        </goals>
    </execution>
</executions>
<configuration>
    <generateDirectory>src/main/generated</generateDirectory>
    <extension>true</extension>
    <removeOldOutput>true</removeOldOutput>
</configuration>

我在 src/main/resources 文件夹中添加了一个 jaxb-bindings.xjb 文件,其中包含以下内容:

    <?xml version="1.0" ?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
          version="2.1" 
          xmlns:kml="http://www.opengis.net/kml/2.2"
          xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <globalBindings>
        <xjc:simple/>
        <xjc:javaType name="java.lang.Boolean" 
                      xmlType="xsd:boolean" 
                      adapter="path.to.my.JaxbBooleanAdapter"/>
    </globalBindings>
    ...
    ...
</bindings>

适配器类是这样的:

package path.to.my;

import javax.xml.bind.annotation.adapters.XmlAdapter;

/**
 * Utility class to correctly render the xml types used in JAXB.
 */
public class JaxbBooleanAdapter extends XmlAdapter<String, Boolean>
{
    @Override
    public Boolean unmarshal(String v) throws Exception
    {
        if ("1".equals(v))
        {
            return true;
        }
        return false;
    }

    @Override
    public String marshal(Boolean v) throws Exception
    {
        if (v == null)
        {
            return null;
        }
        if (v)
        {
            return "1";
        }
        return "0";
    }
}
于 2011-12-14T09:47:21.087 回答
6

JAXB 提供了一种灵活的方式来定制您的绑定。您只需编写一个 XML 文件,该文件将指示您希望如何绑定 XML 和 Java 类型。在您的情况下,您可以使用<javaType>声明,您可以在其中指定 aparseMethod和 a printMethod。这些方法可以很简单

public boolean myParseBool(String s)
{
    return s.equals("1");
}

public String myPrintBool(boolean b)
{
    return b ? "1" : "0";
}

可能存在更简单的方法,可能使用 DatatypeConverter,但我对这个主题还不够了解,无法为您提供更多帮助!

于 2008-12-05T15:13:11.673 回答
1

我可能会创建一个用于将布尔值转换为 int 的类型适配器。JAXB 用户指南中有一些示例

于 2008-12-05T12:44:16.013 回答
0

您可以编写一对解析器/编写器并在绑定 JAXB XML 中定义属性映射。

于 2008-12-05T12:40:15.570 回答