289.12. 예 3: SAP에서 요청 처리

289.12.1. 개요

이 예제에서는 경로에서 구현하는 BOOK_FLIGHT RFC로 요청을 처리하는 경로를 보여줍니다. 또한 JAXB를 사용하여 슬래를 해제하고 SAP 요청 오브젝트를 마샬링하고 사용자 지정 빈에 응답 오브젝트를 마샬링하는 구성 요소의 XML 직렬화 지원을 보여줍니다.

이 경로는 이동 에이전트인 FlightCustomer 를 대신하여 FlightTrip 비즈니스 객체를 생성합니다. 경로는 먼저 SAP 서버 끝점에서 수신한 SAP 요청 오브젝트를 사용자 지정 JAXB 빈으로 분리합니다. 그런 다음 이 사용자 지정 빈은 교환에서 세 개의 하위 경로로 멀티캐스팅됩니다. 이 경로는 항공편을 생성하는 데 필요한 여행 에이전트, 비행 연결 및 승객 정보를 수집합니다. 마지막 하위 경로는 이전 예제에서 시연한 대로 SAP에서 비행 트랜딩 오브젝트를 생성합니다. 마지막 하위 경로도 SAP 응답 오브젝트로 마샬링되고 서버 끝점에서 반환하는 사용자 지정 JAXB 빈을 생성하고 반환합니다.

289.12.2. Java DSL for route

예제 경로의 Java DSL은 다음과 같습니다.

DataFormat jaxb = new JaxbDataFormat("org.fusesource.sap.example.jaxb");

from("sap-srfc-server:nplserver:BOOK_FLIGHT")
    .unmarshal(jaxb)
    .multicast()
    .to("direct:getFlightConnectionInfo",
        "direct:getFlightCustomerInfo",
        "direct:getPassengerInfo")
    .end()
    .to("direct:createFlightTrip")
    .marshal(jaxb);

289.12.3. 경로의 XML DSL

동일한 경로에 대한 XML DSL은 다음과 같습니다.

<route>
    <from uri="sap-srfc-server:nplserver:BOOK_FLIGHT"/>
    <unmarshal>
        <jaxb contextPath="org.fusesource.sap.example.jaxb"/>
    </unmarshal>
    <multicast>
        <to uri="direct:getFlightConnectionInfo"/>
        <to uri="direct:getFlightCustomerInfo"/>
        <to uri="direct:getPassengerInfo"/>
    </multicast>
    <to uri="direct:createFlightTrip"/>
    <marshal>
        <jaxb contextPath="org.fusesource.sap.example.jaxb"/>
    </marshal>
</route>

289.12.4. BookFlightRequest bean

다음 목록에서는 SAP BOOK_FLIGHT 요청 오브젝트의 직렬화된 양식에서 순차하지 않는 JAXB 빈을 보여줍니다.

@XmlRootElement(name="Request", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class BookFlightRequest {

    @XmlAttribute(name="CUSTNAME")
    private String customerName;

    @XmlAttribute(name="FLIGHTDATE")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date flightDate;

    @XmlAttribute(name="TRAVELAGENCYNUMBER")
    private String travelAgencyNumber;

    @XmlAttribute(name="DESTINATION_FROM")
    private String startAirportCode;

    @XmlAttribute(name="DESTINATION_TO")
    private String endAirportCode;

    @XmlAttribute(name="PASSFORM")
    private String passengerFormOfAddress;

    @XmlAttribute(name="PASSNAME")
    private String passengerName;

    @XmlAttribute(name="PASSBIRTH")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date passengerDateOfBirth;

    @XmlAttribute(name="CLASS")
    private String flightClass;

    ...
}

289.12.5. BookFlightResponse 빈

다음 목록에서는 SAP BOOK_FLIGHT 응답 오브젝트의 직렬화된 형태로 마샬링하는 JAXB 빈을 설명합니다.

@XmlRootElement(name="Response", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class BookFlightResponse {

    @XmlAttribute(name="TRIPNUMBER")
    private String tripNumber;

    @XmlAttribute(name="TICKET_PRICE")
    private BigDecimal ticketPrice;

    @XmlAttribute(name="TICKET_TAX")
    private BigDecimal ticketTax;

    @XmlAttribute(name="CURRENCY")
    private String currency;

    @XmlAttribute(name="PASSFORM")
    private String passengerFormOfAddress;

    @XmlAttribute(name="PASSNAME")
    private String passengerName;

    @XmlAttribute(name="PASSBIRTH")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date passengerDateOfBirth;

    @XmlElement(name="FLTINFO")
    private FlightInfo flightInfo;

    @XmlElement(name="CONNINFO")
    private ConnectionInfoTable connectionInfo;

    ...
}
참고

응답 오브젝트의 복잡한 매개 변수 필드는 응답의 자식 요소로 직렬화됩니다.

289.12.6. FlightInfo bean

다음 목록은 복잡한 구조 매개변수 FLTINFO 의 직렬화된 형태로 마샬링하는 JAXB 빈을 보여줍니다.

@XmlRootElement(name="FLTINFO", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class FlightInfo {

    @XmlAttribute(name="FLIGHTTIME")
    private String flightTime;

    @XmlAttribute(name="CITYFROM")
    private String cityFrom;

    @XmlAttribute(name="DEPDATE")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date departureDate;

    @XmlAttribute(name="DEPTIME")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date departureTime;

    @XmlAttribute(name="CITYTO")
    private String cityTo;

    @XmlAttribute(name="ARRDATE")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date arrivalDate;

    @XmlAttribute(name="ARRTIME")
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date arrivalTime;

    ...
}

289.12.7. ConnectionInfoTable 빈

다음 목록은 복잡한 테이블 매개 변수 CONNINFO 의 직렬화된 형태로 마샬링하는 JAXB 빈을 보여줍니다. JAXB 빈의 루트 요소 유형 이름은 _TABLE 과 함께 접미사는 행 구조 유형의 이름에 해당하며 빈에는 행 요소 목록이 포함되어 있습니다.

@XmlRootElement(name="CONNINFO_TABLE", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class ConnectionInfoTable {

    @XmlElement(name="row")
    List<ConnectionInfo> rows;

    ...
}

289.12.8. ConnectionInfo bean

다음 목록에서는 위의 테이블 행 요소의 직렬화된 형태로 마샬링하는 JAXB 빈을 보여줍니다.

@XmlRootElement(name="CONNINFO", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT")
@XmlAccessorType(XmlAccessType.FIELD)
public class ConnectionInfo {

    @XmlAttribute(name="CONNID")
    String connectionId;

    @XmlAttribute(name="AIRLINE")
    String airline;

    @XmlAttribute(name="PLANETYPE")
    String planeType;

    @XmlAttribute(name="CITYFROM")
    String cityFrom;

    @XmlAttribute(name="DEPDATE")
    @XmlJavaTypeAdapter(DateAdapter.class)
    Date departureDate;

    @XmlAttribute(name="DEPTIME")
    @XmlJavaTypeAdapter(DateAdapter.class)
    Date departureTime;

    @XmlAttribute(name="CITYTO")
    String cityTo;

    @XmlAttribute(name="ARRDATE")
    @XmlJavaTypeAdapter(DateAdapter.class)
    Date arrivalDate;

    @XmlAttribute(name="ARRTIME")
    @XmlJavaTypeAdapter(DateAdapter.class)
    Date arrivalTime;

    ...
}