Как разрешить JAXB отображать логические значения 0 и 1, а не true и false - PullRequest
25 голосов
/ 05 декабря 2008

Получил быстрый вопрос. Кто-нибудь знает, как позволить JAXB (marshall) отображать логические поля как 1 и 0 вместо вывода «true» и «false»?

Ответы [ 5 ]

40 голосов
/ 27 октября 2009

Класс адаптера:

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;
}
7 голосов
/ 14 декабря 2011

Имея ту же проблему, что и user20298, я последовал подсказке mtpettyp и адаптировал ее для своей конфигурации.

Моя конфигурация: Maven, чтобы построить проект. - Плагин "org.jvnet.jaxb2.maven2" в Maven. - jaxb 2.2.6 - По этому случаю я делал Java-классы для kml 2.2 (ogckml22.xsd)

И я наткнулся на проблему того, что логические значения должны отображаться как 'true / false', когда Google maps хочет, чтобы они были как '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";
    }
}
6 голосов
/ 05 декабря 2008

JAXB предоставляет гибкий способ настройки ваших привязок . Вам просто нужно написать файл XML, который укажет, как вы хотите связать ваши типы XML и Java. В вашем случае вы можете использовать объявление <javaType>, в котором вы можете указать parseMethod и printMethod. Эти методы могут быть простыми, как

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

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

Возможно, существуют более простые способы, возможно, с использованием DatatypeConverter, но я недостаточно осведомлен об этой теме, чтобы помочь вам больше!

1 голос
/ 05 декабря 2008

Я бы, вероятно, создал бы адаптер типа для преобразования логического значения в int. В руководстве пользователя JAXB есть примеры .

0 голосов
/ 05 декабря 2008

Вы можете написать пару анализаторов / писателей и определить отображение свойств в привязке JAXB XML.

...