37.2. Java의 대체 그룹
37.2.1. 개요
Apache CXF는 CryostatB 사양에 지정된 대로 와일드카드 정의에 대한 support for wildcard 정의 기능과 함께 Java의 네이티브 클래스 계층 구조를 사용하는 대체 그룹을 지원합니다. 대체 그룹의 멤버는 모두 공통 기본 유형을 공유해야 하므로 요소의 유형을 지원하기 위해 생성된 클래스는 공통 기본 유형도 공유합니다. 또한 Apache CXF는 head 요소의 인스턴스를 Cryostat
B Cryostat<?에 매핑합니다.<?는 T> 속성을 확장합니다
.
37.2.2. 생성된 오브젝트 팩토리 방법
대체 그룹이 포함된 패키지를 지원하기 위해 생성된 오브젝트 팩토리에는 대체 그룹의 각 요소에 대한 메서드가 있습니다. 헤드 요소를 제외하고 대체 그룹의 각 멤버에 대해 표 37.1. “Dec declarationing a CryostatB Element의 속성은 Sub Group의 멤버입니다.” 에 설명된 대로 오브젝트 팩토리 메서드를 데코팅하는 @ Cryostat CryostatDecl
주석에는 두 가지 추가 속성이 포함되어 있습니다.
속성 | 설명 |
---|---|
| head 요소가 정의된 네임스페이스를 지정합니다. |
|
head 요소의 |
대체 그룹의 @#159 CryostatDecl
의 head 요소에 대한 개체 팩토리 메서드에는 기본 namespace
속성과 기본 name
속성만 포함됩니다.
요소 인스턴스화 방법 외에도 개체 팩토리에는 헤드 요소를 나타내는 개체를 인스턴스화하는 방법이 포함되어 있습니다.In addition to the element instantiation methods, the object factory contains a method for instantiating an object representing the head element. 대체 그룹의 멤버가 모두 복잡한 유형인 경우 오브젝트 팩토리에는 사용된 각 복잡한 유형의 인스턴스를 인스턴스화하는 방법도 포함됩니다.
예 37.5. “하위 그룹에 대한 Object Cryostat 방법” 예 37.2. “복잡한 유형이 있는 대체 그룹” 에 정의된 대체 그룹에 대한 오브젝트 팩토리 메서드를 표시합니다.
예 37.5. 하위 그룹에 대한 Object Cryostat 방법
public class ObjectFactory { private final static QName _Widget_QNAME = new QName(...); private final static QName _PlasticWidget_QNAME = new QName(...); private final static QName _WoodWidget_QNAME = new QName(...); public ObjectFactory() { } public WidgetType createWidgetType() { return new WidgetType(); } public PlasticWidgetType createPlasticWidgetType() { return new PlasticWidgetType(); } public WoodWidgetType createWoodWidgetType() { return new WoodWidgetType(); } @XmlElementDecl(namespace="...", name = "widget") public JAXBElement<WidgetType> createWidget(WidgetType value) { return new JAXBElement<WidgetType>(_Widget_QNAME, WidgetType.class, null, value); } @XmlElementDecl(namespace = "...", name = "plasticWidget", substitutionHeadNamespace = "...", substitutionHeadName = "widget") public JAXBElement<PlasticWidgetType> createPlasticWidget(PlasticWidgetType value) { return new JAXBElement<PlasticWidgetType>(_PlasticWidget_QNAME, PlasticWidgetType.class, null, value); } @XmlElementDecl(namespace = "...", name = "woodWidget", substitutionHeadNamespace = "...", substitutionHeadName = "widget") public JAXBElement<WoodWidgetType> createWoodWidget(WoodWidgetType value) { return new JAXBElement<WoodWidgetType>(_WoodWidget_QNAME, WoodWidgetType.class, null, value); } }
37.2.3. 인터페이스의 대체 그룹
대체 그룹의 head 요소가 작업 메시지 중 하나에서 메시지 부분으로 사용되는 경우 결과 메서드 매개변수는 해당 요소를 지원하기 위해 생성된 클래스의 개체가 됩니다. 반드시 T> 클래스를 확장합니다
. 런타임은 Java의 네이티브 유형 계층 구조를 사용하여 유형 대체를 지원하며 Java는 지원되지 않는 유형을 사용하려고 하는 모든 시도를 catch합니다.
런타임에서 요소 대체를 지원하는 데 필요한 모든 클래스를 인식하도록 SEI는 @ CryostatSeeAlso
주석으로 데코레이팅됩니다. 이 주석은 런타임에서 마샬링에 필요한 클래스 목록을 지정합니다. @ CryostatSeeAlso 주석 사용에 대한 자세한
내용은 32.4절. “런타임 Marshaller에 클래스 추가” 을 참조하십시오.
예 37.7. “하위 그룹을 사용하여 생성된 인터페이스” 예 37.6. “하위 그룹을 사용하는 WSDL 인터페이스” 에 표시된 인터페이스에 대해 생성된 SEI를 표시합니다. 인터페이스에서는 예 37.2. “복잡한 유형이 있는 대체 그룹” 에 정의된 대체 그룹을 사용합니다.
예 37.6. 하위 그룹을 사용하는 WSDL 인터페이스
<message name="widgetMessage"> <part name="widgetPart" element="xsd1:widget" /> </message> <message name="numWidgets"> <part name="numInventory" type="xsd:int" /> </message> <message name="badSize"> <part name="numInventory" type="xsd:int" /> </message> <portType name="orderWidgets"> <operation name="placeWidgetOrder"> <input message="tns:widgetOrder" name="order" /> <output message="tns:widgetOrderBill" name="bill" /> <fault message="tns:badSize" name="sizeFault" /> </operation> <operation name="checkWidgets"> <input message="tns:widgetMessage" name="request" /> <output message="tns:numWidgets" name="response" /> </operation> </portType>
예 37.7. 하위 그룹을 사용하여 생성된 인터페이스
@WebService(targetNamespace = "...", name = "orderWidgets")
@XmlSeeAlso({com.widgetvendor.types.widgettypes.ObjectFactory.class})
public interface OrderWidgets {
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@WebResult(name = "numInventory", targetNamespace = "", partName = "numInventory")
@WebMethod
public int checkWidgets(
@WebParam(partName = "widgetPart", name = "widget", targetNamespace = "...")
com.widgetvendor.types.widgettypes.WidgetType widgetPart
);
}
예 37.7. “하위 그룹을 사용하여 생성된 인터페이스” 에 표시된 SEI는 @ CryostatSeeAlso
주석에 오브젝트 팩토리를 나열합니다. 네임스페이스의 오브젝트 팩토리를 나열하면 해당 네임스페이스에 대해 생성된 모든 클래스에 액세스할 수 있습니다.
37.2.4. 복잡한 유형의 대체 그룹
대체 그룹의 head 요소가 복잡한 유형의 요소로 사용되는 경우 코드 생성기는 요소를 T> 속성에 매핑합니다
. 대체 그룹을 지원하기 위해 생성된 클래스의 인스턴스가 포함된 속성에 매핑되지 않습니다.
예를 들어 예 37.8. “하위 그룹을 사용하는 복잡한 유형” 에 정의된 복잡한 유형은 예 37.9. “하위 그룹을 사용하여 복잡한 유형의 Java 클래스” 에 표시된 Java 클래스를 생성합니다. 복잡한 유형은 예 37.2. “복잡한 유형이 있는 대체 그룹” 에 정의된 대체 그룹을 사용합니다.
예 37.8. 하위 그룹을 사용하는 복잡한 유형
<complexType name="widgetOrderInfo">
<sequence>
<element name="amount" type="xsd:int"/>
<element ref="xsd1:widget"/>
</sequence>
</complexType>
예 37.9. 하위 그룹을 사용하여 복잡한 유형의 Java 클래스
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "widgetOrderInfo", propOrder = {"amount","widget",}) public class WidgetOrderInfo { protected int amount; @XmlElementRef(name = "widget", namespace = "...", type = JAXBElement.class) protected JAXBElement<? extends WidgetType> widget; public int getAmount() { return amount; } public void setAmount(int value) { this.amount = value; } public JAXBElement<? extends WidgetType> getWidget() { return widget; } public void setWidget(JAXBElement<? extends WidgetType> value) { this.widget = ((JAXBElement<? extends WidgetType> ) value); } }
37.2.5. 대체 그룹 속성 설정
대체 그룹으로 작업하는 방법은 코드 생성기가 그룹을 직접 Java 클래스에 매핑했는지 아니면 T> 클래스를 확장했는지
에 따라 달라집니다. 요소가 생성된 값 클래스의 개체에 간단히 매핑되면 유형 계층 구조의 일부인 다른 Java 개체로 작업하는 것과 동일한 방식으로 개체로 작업합니다. 상위 클래스의 하위 클래스를 대체할 수 있습니다. 오브젝트를 검사하여 정확한 클래스를 확인하고 적절하게 캐스팅할 수 있습니다.
CryostatB 사양은 오브젝트 팩토리 메서드를 사용하여 생성된 클래스의 개체를 인스턴스화하는 것이 좋습니다.
코드 생성기가 T> 오브젝트를 확장하여
대체 그룹의 인스턴스를 유지하기 위해 확장하면 element의 값을 Cryostat B Cryostat<? extends T
> 오브젝트로 래핑해야 합니다. 이를 수행하는 가장 좋은 방법은 오브젝트 팩토리에서 제공하는 요소 생성 방법을 사용하는 것입니다. 해당 값을 기반으로 요소를 만들 수 있는 간단한 수단을 제공합니다.
예 37.10. “하위 그룹의 멤버 설정” 대체 그룹 인스턴스를 설정하는 코드를 표시합니다.
예 37.10. 하위 그룹의 멤버 설정
ObjectFactory of = new ObjectFactory(); PlasticWidgetType pWidget = of.createPlasticWidgetType(); pWidget.setShape = "round'; pWidget.setColor = "green"; pWidget.setMoldProcess = "injection"; JAXBElement<PlasticWidgetType> widget = of.createPlasticWidget(pWidget); WidgetOrderInfo order = of.createWidgetOrderInfo(); order.setWidget(widget);
예 37.10. “하위 그룹의 멤버 설정” 의 코드는 다음을 수행합니다.
오브젝트 팩토리를 인스턴스화합니다.
ScanSetting WidgetType 오브젝트
를 인스턴스화합니다.
opm B Cryostat<PlasticWidgetType
> 오브젝트를 인스턴스화하여 가발성 위젯 요소를 유지합니다.
개체를 인스턴스화합니다
.
Cryostat OrderInfo
오브젝트의 위젯을 목형 위젯
요소를 보유하고 있는 CryostatB
Cryostat 오브젝트로 설정합니다.
37.2.6. 대체 그룹 속성의 값 가져오기
개체 팩토리 메서드는 T> 개체에서 요소의 값을 추출할
때 도움이 되지 않습니다. Cryostat B Cryostat<?는 T> 오브젝트의
. 다음 옵션은 getValue()
메서드를 확장합니다getValue()
메서드에서 반환하는 오브젝트 유형을 결정합니다.
-
가능한 모든 클래스의
isInstance()
메서드를 사용하여 요소의 value 개체의 클래스를 확인합니다. Cryostat
B Cryostat<? extends T
> object'sgetName()
메서드를 사용하여 요소의 이름을 확인합니다.getName()
메서드는 QName을 반환합니다. 요소의 로컬 이름을 사용하여 value 오브젝트에 대한 적절한 클래스를 확인할 수 있습니다.Cryostat
B Cryostat<? extends T
> object'sgetDec declarationedType()
메서드를 사용하여 value 오브젝트의 클래스를 확인합니다.getDec declarationedType()
메서드는 요소의 value 개체의Class
개체를 반환합니다.주의getDec declarationedType()
메서드는 value 개체의 실제 클래스에 관계없이 head 요소에 대한 기본 클래스를 반환할 가능성이 있습니다.
예 37.11. “하위 그룹의 멤버의 가치 얻기” 대체 그룹에서 값을 검색하는 코드를 표시합니다. 요소의 value 개체의 적절한 클래스를 확인하기 위해 예제에서는 요소의 getName()
메서드를 사용합니다.
예 37.11. 하위 그룹의 멤버의 가치 얻기
String elementName = order.getWidget().getName().getLocalPart(); if (elementName.equals("woodWidget") { WoodWidgetType widget=order.getWidget().getValue(); } else if (elementName.equals("plasticWidget") { PlasticWidgetType widget=order.getWidget().getValue(); } else { WidgetType widget=order.getWidget().getValue(); }