37.3.2. CheckWidgets 작업
37.3.2.1. 개요
CheckWidgets
는 대체 그룹의 헤드 멤버인 매개 변수가 있는 간단한 작업입니다. 이 작업에서는 대체 그룹의 멤버인 개별 매개 변수를 처리하는 방법을 보여줍니다. 소비자는 매개변수가 대체 그룹의 유효한 멤버인지 확인해야 합니다. 서비스에서는 요청에 전송된 대체 그룹의 멤버를 올바르게 결정해야 합니다.
37.3.2.2. 소비자 구현
생성된 메서드 서명은 대체 그룹의 head 요소 유형을 지원하는 Java 클래스를 사용합니다. 대체 그룹의 멤버 요소는 head 요소 또는 head 요소의 유형에서 파생 된 형식의 동일한 유형 중 하나이므로 대체 그룹의 멤버를 지원하기 위해 생성된 Java 클래스는 head 요소를 지원하기 위해 생성된 Java 클래스에서 상속됩니다. Java의 유형 계층 구조는 기본적으로 상위 클래스 대신 하위 클래스를 사용할 수 있도록 지원합니다.
Apache CXF가 대체 그룹 및 Java 유형 계층 구조에 대한 유형을 생성하는 방법 때문에 클라이언트는 특수 코드를 사용하지 않고 checkWidgets()
를 호출할 수 있습니다. checkWidgets()
를 호출할 논리를 개발할 때 위젯 대체 그룹을 지원하기 위해 생성된 클래스 중 하나의 개체로 전달할 수 있습니다.
예 37.14. “consumer Invoking checkWidgets()
” checkWidgets()
를 호출하는 소비자를 표시합니다.
예 37.14. consumer Invoking checkWidgets()
System.out.println("What type of widgets do you want to order?"); System.out.println("1 - Normal"); System.out.println("2 - Wood"); System.out.println("3 - Plastic"); System.out.println("Selection [1-3]"); String selection = reader.readLine(); String trimmed = selection.trim(); char widgetType = trimmed.charAt(0); switch (widgetType) { case '1': { WidgetType widget = new WidgetType(); ... break; } case '2': { WoodWidgetType widget = new WoodWidgetType(); ... break; } case '3': { PlasticWidgetType widget = new PlasticWidgetType(); ... break; } default : System.out.println("Invaid Widget Selection!!"); } proxy.checkWidgets(widgets);
37.3.2.3. 서비스 구현
checkWidgets()
서비스의 구현은 위젯 Type
오브젝트로 위젯 설명을 가져오고, 위젯의 인벤토리를 확인하고, 주식의 위젯 수를 반환합니다. 대체 그룹을 구현하는 데 사용되는 모든 클래스는 동일한 기본 클래스에서 상속되므로 JAXB 특정 API를 사용하지 않고 checkWidgets()
를 구현할 수 있습니다.
위젯에 대한 대체 그룹의 멤버를 지원하기 위해 생성된 모든 클래스는 위젯 Type 클래스
확장합니다. 이 사실 때문에 를
instanceof
를 사용하여 전달된 위젯 유형을 확인하고, 필요한 경우 widgetPart
오브젝트를 보다 제한적인 유형으로 캐스팅할 수 있습니다. 적절한 유형의 오브젝트가 있으면 위젯의 올바른 종류를 확인할 수 있습니다.
예 37.15. “CheckWidgets()의 서비스 구현()
” 가능한 구현을 보여줍니다.
예 37.15. CheckWidgets()의 서비스 구현()
public int checkWidgets(WidgetType widgetPart) { if (widgetPart instanceof WidgetType) { return checkWidgetInventory(widgetType); } else if (widgetPart instanceof WoodWidgetType) { WoodWidgetType widget = (WoodWidgetType)widgetPart; return checkWoodWidgetInventory(widget); } else if (widgetPart instanceof PlasticWidgetType) { PlasticWidgetType widget = (PlasticWidgetType)widgetPart; return checkPlasticWidgetInventory(widget); } }