2014-10-01 1 views
0

Я хотел бы использовать XJC для создания объектов JAXB во время использования XmlJavaTypeAdapterКак создать @XmlSchemaType для элемента настроенного с XJC: javaType

Я в настоящее время используется в следующих глобальных привязок:

<xjc:javaType name="java.lang.Boolean" 
         xmlType="xsd:boolean" 
         adapter="path.to.my.CustomBooleanAdapter"/> 

Он генерирует следующий код:

@XmlJavaTypeAdapter(CustomBooleanAdapter.class) 
    @XmlElement(type=String.class) 
    private Boolean finished; 

Однако я хотел бы код, чтобы иметь @XmlSchemaType булевых и без типа @XmlElement строки

@XmlJavaTypeAdapter(BooleanAdapter.class) 
@XmlSchemaType(name = "boolean") 
private Boolean finished; 

код адаптер:

public class CustomBooleanAdapter extends XmlAdapter<String, Boolean> { 
    @Override 
    public Boolean unmarshal(String s) { 
     if("true".equals(s) || "false".equals(s)){ 
      return Boolean.valueOf(s); 
     } 
     return null; 

    } 

    @Override 
    public String marshal(Boolean c) { 
     return c == null ? null : c.toString(); 
    } 
} 

Есть ли способ сказать XJC для создания @XmlSchemaType аннотации и удалить @XmlElement строчного типа

+0

Не могли бы вы также разместить свой «CustomBooleanAdapter»? – lexicore

+0

@lexicore Я добавил код адаптера выше, любые предложения будут оценены – indybee

+0

Я думаю, что вы получаете 'String', потому что ваш адаптер является' Boolean' '' String'. Я думаю, вы могли бы переопределить аннотации с помощью аннотатного плагина, но сначала вопрос - почему? Какая-то конкретная причина для этого? Я имею в виду, вы вряд ли сгенерируете схему из своего кода, если используете XJC ... – lexicore

ответ

1

Ok, как обещал.

Annotate plugin позволяет добавлять аннотации к сгенерированному коду.

SO отказ от ответственности: Я автор.

Документация: here.

Example:

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:annox="http://annox.dev.java.net" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    jaxb:extensionBindingPrefixes="annox xjc" 
    jaxb:version="1.0"> 

    <xs:annotation> 
     <xs:appinfo> 
      <jaxb:globalBindings> 
       <xjc:javaType name="java.lang.Boolean" xmlType="xs:boolean" adapter="org.jvnet.jaxb2_commons.tests.one.CustomBooleanAdapter"/> 
      </jaxb:globalBindings> 
     </xs:appinfo> 
    </xs:annotation> 

    <xs:complexType name="javaTypeExample"> 
     <xs:sequence> 
      <xs:element name="customBooleanProperty" type="xs:boolean" minOccurs="0"> 
       <xs:annotation> 
        <xs:appinfo> 
         <annox:annotate target="field">@javax.xml.bind.annotation.XmlElement(type=java.lang.Boolean.class)</annox:annotate> 
         <annox:annotate target="field">@javax.xml.bind.annotation.XmlSchemaType(name="boolean")</annox:annotate> 
        </xs:appinfo> 
       </xs:annotation> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

Формирует:

@XmlElement(type = Boolean.class) 
@XmlJavaTypeAdapter(CustomBooleanAdapter.class) 
@XmlSchemaType(name = "boolean") 
protected Boolean customBooleanProperty; 

Несколько замечаний по использованию:

  • Обратите внимание, что вы должны сказать target="field", так как вы должны поставить свои аннотации на поле , иначе они будут добавлены к получателю по умолчанию.
  • Синтаксис Java, но ...
  • ... Вы должны использовать полностью квалифицированные имена классов для всего (аннотации, классы аннотаций полей и т.д.)
  • Вы не можете удалить @XmlElement аннотацию (не такая функция), но вы можете перезаписать его @XmlElement(type=Boolean.class).

Я также добавил небольшой test case.

+0

Спасибо @lexicore это похоже на решение, в котором я нуждаюсь, я пробую его и дам вам знать результаты. – indybee

+0

Спасибо @lexicore, я, наконец, получил его работать так, как вы объяснили. (У меня были неправильные зависимости maven, поэтому мне потребовалось некоторое время, чтобы заставить его работать). Я думаю, что @XmlElement (type = Boolean.class) получил классное исключение, хотя, конечно, я не могу использовать его для этой цели после завершения , Я столкнулся с несколькими другими вариантами использования, в которых я хотел добавить аннотации к сгенерированным объектам jaxb, поэтому это будет полезно для этих целей. Большое спасибо за ваши предложения и примеры. – indybee

Смежные вопросы