Как удалить "is" из сгенерированных JAXB логических геттеров - PullRequest
7 голосов
/ 03 февраля 2012

JAXB генерирует такие методы, как: isIsBuyNow() и isHasBuyNow(), когда я хочу isBuyNow() или hasBuyNow().

Существует множество методов класса, которые генерируются, поэтому индивидуально настраиваем имена созданных методовне осуществимо.

Первое, что пришло в голову, - это какое-то правило регулярных выражений для настройки JAXB, но я не могу найти такого общего способа изменить имена методов.

Ответы [ 3 ]

4 голосов
/ 03 февраля 2012

Вы можете использовать внешний файл привязок для настройки имени вашего свойства.Чтобы JAXB распознал метод как свойство, он должен следовать соглашению, начиная с get или is для логических типов.

schema.xsd

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

   <xs:complexType name="root">
      <xs:attribute name="is-buy-now" type="xs:boolean"/>
   </xs:complexType>

</xs:schema>

bindings.xml

В приведенном ниже файле привязок мы указали имя свойства для атрибута XML с именем is-buy-now:

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">
    <jxb:bindings schemaLocation="is.xsd">
        <jxb:bindings node="//xs:complexType[@name='root']/xs:attribute[@name='is-buy-now']">
        <jxb:property name="buyNow"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

Вызов XJC

Параметр -b используется для указания файла привязок:

xjc -d out -b bindings.xml schema.xsd

Root

В результатеследующий класс будет создан с помощью методов: isBuyNow и setBuyNow:

<code>//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2012.02.03 at 05:18:59 AM EST 
//


package generated;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for root complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="root">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;attribute name="is-buy-now" type="{http://www.w3.org/2001/XMLSchema}boolean" />
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "root") открытый класс Root {@XmlAttribute (name = "is-buy-now") защищенный логический buyNow;/ ** * Получает значение свойства buyNow.* * @return * возможным объектом является * {@link Boolean} * * / public Boolean isBuyNow () {return buyNow;} / ** * Устанавливает значение свойства buyNow.* * @param value * допустимым объектом является * {@link Boolean} * * / public void setBuyNow (Boolean value) {this.buyNow = value;}}

ОБНОВЛЕНИЕ

Если вы начинаете с классов Java, вы можете указать @XmlAccessorType(XmlAccessType.FIELD) для сопоставления с полями и назвать ваши методы по своему выбору:

@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlAttribute(name="has-buy-now")
    private boolean buyNow;

    public boolean hasBuyNow() {
        return buyNow;
    }

}
2 голосов
/ 03 февраля 2012

Перед походом плагин по маршруту.Я бы подчеркнул, что имя вашей переменной должно быть корректным.Это должно быть в соответствии с соглашениями Java Bean.И JAXB должен работать только в соответствии с этим.

, поэтому, если переменная логическая, в идеале ist должно быть buyNow.Соответствующий метод получателя станет isBuyNow () только тем, который вы хотите.Это было бы вопросом регенерации отображений снова.Нет regeex нет пользовательского поиска / замены, как вы (справедливо) хотите:)

2 голосов
/ 03 февраля 2012

Исходя из этого, вам нужно только изменить имена методов, а не имена классов. Вы можете быть в состоянии:

  1. найдите плагин XJC, который позволяет это, или
  2. написать плагин XJC, который делает это

Я сомневаюсь, что существует первый вариант (хотя вам может повезти), но второй вариант кажется довольно простым. См. на этой странице , где приведены некоторые сообщения о том, как написать свой собственный текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...