Red Hat Training

A Red Hat training course is available for Red Hat Fuse

140.10. 例 3: SAP からのリクエストの処理

概要

この例は、SAP から BOOK_FLIGHT RFC への要求を処理するルートを示しています。これはルートによって実装されます。さらに、JAXB を使用して SAP リクエストオブジェクトおよび応答オブジェクトをカスタム Bean にアンマーシャリングおよびマーシャリングし、コンポーネントの XML シリアライゼーションサポートも示しています。
このルートは、移動エージェント FlightCustomer の代わりに FlightTrip ビジネスオブジェクトを作成します。ルートが最初に SAP サーバーエンドポイントによって受信された SAP リクエストオブジェクトをカスタム JAXB Bean にアンマーシャリングします。このカスタム Bean は、3 つのサブルートへの交換でマルチキャストされ、フライトのトリップの作成に必要な移動エージェント、フライト接続、および乗客情報を収集します。最後のサブルートは、前の例に示すように、SAP でフライトトリップオブジェクトを作成します。最後のサブルートは、SAP 応答オブジェクトにマーシャリングされ、サーバーエンドポイントによって返されるカスタム JAXB Bean も作成および返します。

ルートの Java DSL

サンプルルートの 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);

ルートの 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>

BookFlightRequest bean

以下のリストは、SAP BOOK_FLIGHT リクエストオブジェクトのシリアル化形式からアンマーシャリングする JAXB Bean を示しています。
@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;

    ...
}

BookFlightResponse Bean

以下のリストは、SAP BOOK_FLIGHT 応答オブジェクトのシリアル化形式にマーシャリングする JAXB Bean を示しています。
@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;


    ...
}
注記
応答オブジェクトの複雑なパラメーターフィールドは、応答の子要素としてシリアライズされます。

FlightInfo ビーン

以下のリストは、複雑な構造パラメーターのシリアル化形式にマーシャリングする JAXB Bean を示しています FLTINFO
@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;

    ...
}

ConnectionInfoTable Bean

以下のリストは、複雑なテーブルパラメーターのシリアル化形式( CONNINFO )にマーシャリングする JAXB Bean を示しています。JAXB Bean のルート要素タイプの名前は、_TABLE で接尾辞が付けられた行構造タイプの名前に対応し、Bean には行要素のリストが含まれることに注意してください。
@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;
    
    ...
}

ConnectionInfo bean

以下のリストは、上記のテーブル行要素のシリアル化された形式にマーシャリングする JAXB Bean を示しています。
@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;

    ...
}