38.4. 열거 매핑 사용자 정의

38.4.1. 개요

xsd:string 이외의 스키마 유형을 기반으로 하는 열거 형식을 사용하려면 코드 생성기가 매핑하도록 지시해야 합니다.If you want enumerated types that are based on a schema type other than xsd:string, you must instruct the code generator to map it. 생성된 열거 상수의 이름을 제어할 수도 있습니다.

사용자 지정은 jaxb:typesafeEnumClass 요소와 하나 이상의 jaxb:typesafeEnumMember 요소를 사용하여 수행됩니다.

또한 코드 생성기의 기본 설정으로 인해 열거된 모든 멤버에 대해 유효한 Java 식별자를 만들 수 없는 인스턴스가 있을 수 있습니다. globalBindings 사용자 지정 특성을 사용하여 코드 생성기가 이를 처리하는 방법을 사용자 지정할 수 있습니다.

38.4.2. 멤버 이름 사용자 정의

열거 멤버를 생성할 때 코드 생성기가 이름 지정 충돌을 발견하거나 열거 멤버에 대해 유효한 Java 식별자를 만들 수 없는 경우 코드 생성기는 기본적으로 경고를 생성하고 열거에 대한 Java enum 유형을 생성하지 않습니다.

globalBinding 요소의 typesafeEnumMemberName 특성을 추가하여 이 동작을 변경할 수 있습니다. typesafeEnumMemberName 속성의 값은 표 38.2. “열거 멤버 이름 생성 사용자 지정 값” 에 설명되어 있습니다.

표 38.2. 열거 멤버 이름 생성 사용자 지정 값

현재의설명

skipGeneration(기본값)

Java enum 형식이 생성되지 않고 경고를 생성하도록 지정합니다.

generateName

VALUE_N 패턴에 따라 멤버 이름이 생성되도록 지정합니다. N 은 1에서 시작하여 각 열거 멤버에 대해 증가됩니다.N starts at one, and is incremented for each member of the enumeration.

generateError

열거를 Java 열거 형식에 매핑할 수 없을 때 코드 생성기가 오류를 생성하도록 지정합니다.

예 38.17. “Force Type Safe Member Names에 대한 사용자 정의” 코드 생성기가 type safe 멤버 이름을 생성하도록 하는 인라인 사용자 지정을 표시합니다.

예 38.17. Force Type Safe Member Names에 대한 사용자 정의

<schema targetNamespace="http://widget.com/types/widgetTypes"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        jaxb:version="2.0">
  <annotation>
    <appinfo>
      <jaxb:globalBindings typesafeEnumMemberName="generateName" />
    </appinfo>
  </annotation>
  ...
</schema>

38.4.3. 클래스 사용자 정의기

jaxb:typesafeEnumClass 요소는 XML 스키마 열거를 Java enum 유형에 매핑하도록 지정합니다. 표 38.3. “생성된 열거 클래스 사용자 지정에 대한 특성” 에 설명된 두 가지 속성이 있습니다. jaxb:typesafeEnumClass 요소가 인라인으로 지정되면 수정 중인 간단한 유형의 xsd:annotation 요소 내에 배치해야 합니다.

표 38.3. 생성된 열거 클래스 사용자 지정에 대한 특성

속성설명

name

생성된 Java enum 유형의 이름을 지정합니다. 이 값은 유효한 Java 식별자여야 합니다.

map

열거를 Java 열거 형식에 매핑해야 하는지 여부를 지정합니다. 기본값은 true입니다.

38.4.4. 멤버 사용자 정의기

jaxb:typesafeEnumMember 요소는 XML 스키마 열거 facet와 Java enum 형식 상수 간의 매핑을 지정합니다. 열거자에서 각 열거면에 대해 하나의 jaxb:typesafeEnumMember 요소를 사용해야 합니다.You must use one jaxb:typesafeEnumMember element for each enumeration facet in the enumeration being customized.

인라인 사용자 지정을 사용하는 경우 다음 두 가지 방법 중 하나로 이 요소를 사용할 수 있습니다.

  • 이는 수정 중인 열거 facet의 xsd:annotation 요소 내에 배치할 수 있습니다.
  • 모두 열거를 사용자 지정하는 데 사용되는 jaxb:typesafeEnumClass 요소의 하위 항목으로 배치할 수 있습니다.

jaxb:typesafeEnumMember 요소에는 필요한 name 특성이 있습니다. name 속성은 생성된 Java enum 유형 상수의 이름을 지정합니다. 값은 유효한 Java 식별자여야 합니다.

jaxb:typesafeEnumMember 요소에 특성도 있습니다. 이 값은 열거 면을 적절한 jaxb:typesafeEnumMember 요소와 연결하는 데 사용됩니다. value 특성 값은 enum facets' value 특성의 값 중 하나와 일치해야 합니다. 이 속성은 유형 생성을 위해 외부 바인딩 사양을 사용하거나 jaxb:typesafeEnumMember 요소를 jaxb:typesafeEnumClass 요소의 하위 항목으로 그룹화할 때 필요합니다.

38.4.5. 예

예 38.18. “열거된 형식의 인라인 사용자 지정In-line Customization of an Enumerated Type” 인라인 사용자 지정을 사용하고 열거된 멤버가 별도로 사용자 지정된 열거된 형식을 표시합니다.Shows an enumerated type that uses in-line customization and has the enumeration's members customized separately.

예 38.18. 열거된 형식의 인라인 사용자 지정In-line Customization of an Enumerated Type

<schema targetNamespace="http://widget.com/types/widgetTypes"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        jaxb:version="2.0">
  <simpleType name="widgetInteger">
    <annotation>
      <appinfo>
        <jaxb:typesafeEnumClass />
      </appinfo>
    </annotation>
    <restriction base="xsd:int">
      <enumeration value="1">
        <annotation>
          <appinfo>
            <jaxb:typesafeEnumMember name="one" />
          </appinfo>
        </annotation>
      </enumeration>
      <enumeration value="2">
        <annotation>
          <appinfo>
            <jaxb:typesafeEnumMember name="two" />
          </appinfo>
        </annotation>
      </enumeration>
      <enumeration value="3">
        <annotation>
          <appinfo>
            <jaxb:typesafeEnumMember name="three" />
          </appinfo>
        </annotation>
      </enumeration>
      <enumeration value="4">
        <annotation>
          <appinfo>
            <jaxb:typesafeEnumMember name="four" />
          </appinfo>
        </annotation>
      </enumeration>
    </restriction>
  </simpleType>
<schema>

예 38.19. “Combined Mapping을 사용하여 열거된 형식의 인라인 사용자 지정In-line Customization of an Enumerated Type Using a Combined Mapping” 인라인 사용자 지정을 사용하고 클래스 사용자 지정에 멤버의 사용자 지정을 결합하는 열거 형식을 표시합니다.

예 38.19. Combined Mapping을 사용하여 열거된 형식의 인라인 사용자 지정In-line Customization of an Enumerated Type Using a Combined Mapping

<schema targetNamespace="http://widget.com/types/widgetTypes"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        jaxb:version="2.0">
  <simpleType name="widgetInteger">
    <annotation>
      <appinfo>
        <jaxb:typesafeEnumClass>
            <jaxb:typesafeEnumMember value="1" name="one" />
            <jaxb:typesafeEnumMember value="2" name="two" />
            <jaxb:typesafeEnumMember value="3" name="three" />
            <jaxb:typesafeEnumMember value="4" name="four" />
        </jaxb:typesafeEnumClass>
      </appinfo>
    </annotation>
    <restriction base="xsd:int">
      <enumeration value="1" />
      <enumeration value="2" />
      <enumeration value="3" />
      <enumeration value="4" >
    </restriction>
  </simpleType>
<schema>

예 38.20. “열거 사용자 지정을 위한 바인딩 파일” 열거된 유형을 사용자 지정하는 외부 바인딩 파일을 표시합니다.Shows an external binding file that customizes an enumerated type.

예 38.20. 열거 사용자 지정을 위한 바인딩 파일

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               jaxb:version="2.0">
  <jaxb:bindings schemaLocation="enumMap.xsd">
    <jaxb:bindings node="xsd:simpleType[@name='widgetInteger']">
        <jaxb:typesafeEnumClass>
            <jaxb:typesafeEnumMember value="1" name="one" />
            <jaxb:typesafeEnumMember value="2" name="two" />
            <jaxb:typesafeEnumMember value="3" name="three" />
            <jaxb:typesafeEnumMember value="4" name="four" />
        </jaxb:typesafeEnumClass>
    </jaxb:bindings>
  </jaxb:bindings>
<jaxb:bindings>