JAXB - генерация классов из XSD - преобразование перечислений в пользовательские toString (), отличные от enum name - PullRequest
3 голосов
/ 10 сентября 2011

Используя JAXB, мы генерируем наши Java-бины напрямую. В XSD у нас есть перечислимый тип (скажем):

<xs:simpleType name="ColorType">
   <xs:restriction base="xs:string">
   <xs:enumeration value="Red"/>
   <xs:enumeration value="Blue"/>
   <xs:enumeration value="Green"/>
</xs:restriction> </xs:simpleType>

В базе данных у нас могут быть флаги типа R, B и G для красного, черного и зеленого. В некотором смысле, у нас есть флаги, состоящие из одного буквенного слова. Я хочу перечислить, что ... ColorType.Red.toString () равно равно до R ... или что-то подобное, так что я могу ссылка R на это. Прямо сейчас я вручную проверяю enumtype с помощью некоторого условного оператора, а затем при вставке или любой операции базы данных я конвертирую обратно в строку.

Какое-то глупое решение, которое пришло мне в голову, чтобы решить это (глупо, эти решения не годятся) Я думаю, что одно решение, чтобы решить это, используя

<xs:enumeration value="R">

но это не говорит мне, что такое R.

Вторым решением может быть создание ColorType в виде строки, но это означает, что мой ColorType может быть даже Z, который не является каким-либо цветом в базе данных, так что я имею в виду, что он будет неограниченным. :( ...

Есть ли способ решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 10 июня 2013

Для этого вы можете использовать XJB-Binding, например:

<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<jxb:bindings schemaLocation="MySchema.xsd" node="xs:simpleType[@name='ColorType']">
    <jxb:typesafeEnumClass>
        <jxb:typesafeEnumMember value="Red" name="R" />
        <jxb:typesafeEnumMember value="Green" name="G" />
        <jxb:typesafeEnumMember value="Blue" name="B" />
    </jxb:typesafeEnumClass>
</jxb:bindings>

Это создаст Enum, содержащий желаемое отображение.Вы можете получить доступ к значению, вызвав сгенерированный value() -метод Enum.(Не забудьте указать правильное расположение схемы в привязке, если ваш XSD не называется MySchema.xsd)

0 голосов
/ 12 сентября 2011

Пока я использую промежуточный раствор. Сейчас я просто использую другой ENUM со статическим методом для возврата enum типа XSD.

Итак, теперь есть 1 перечисление xsd (сгенерировано):

<xs:simpleType name="ColorType">
   <xs:restriction base="xs:string">
   <xs:enumeration value="Red"/>
   <xs:enumeration value="Blue"/>
   <xs:enumeration value="Green"/>
</xs:restriction> </xs:simpleType>

Другое перечисление реализовано вручную в java:

enum ColorCode{ 
   Red("R"), Green("G"), Blue("B") ;
   private String clrCode;
   ColorCode(String s){
      clrCode = s;
   }

   public String toString(){
      return clrCode;
   }

   public static ColorCode getColorCode(ColorType clrTypeEnum){
       switch(clrTypeEnum){
          case RED: return Red; break;
          case BLUE: return Blue; break;
          case GREEN: return Green; break;
       }
   }
}

Теперь мы можем получить цветовой код для вставки в базу данных вместо того, чтобы писать код if-else снова и снова, чтобы получить цветовой код. Используя другое перечисление в качестве преобразователя, предоставьте ограничение, чем свободные типизированные типы, такие как строка.

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

0 голосов
/ 10 сентября 2011

Это может помочь: http://fusesource.com/docs/framework/2.1/jaxws/JAXWSCustomTypeMappingEnum.html

Похоже, я неправильно понял вашу проблему.Единственное решение, которое я вижу, это переопределить сгенерированный метод класса toString.Замените его на тот, который возвращает только первую букву вашего значения Enum.Таким образом, RED вернет R.

...