290.14. SAP の例
290.14.1. 例 1: SAP からのデータの読み取り
概要
この例は、SAP から FlightCustomer
ビジネスオブジェクトデータを読み取るルートを示しています。ルートは、データを取得するために SAP 同期 RFC 宛先エンドポイントを使用して FlightCustomer
BAPI メソッド、BAPI_FLCUST_GETLIST
を呼び出します。
ルートの Java DSL
サンプルルートの Java DSL は次のとおりです。
from("direct:getFlightCustomerInfo") .to("bean:createFlightCustomerGetListRequest") .to("sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST") .to("bean:returnFlightCustomerInfo");
ルートの XML DSL
また、同じルートの Spring DSL は次のとおりです。
<route> <from uri="direct:getFlightCustomerInfo"/> <to uri="bean:createFlightCustomerGetListRequest"/> <to uri="sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST"/> <to uri="bean:returnFlightCustomerInfo"/> </route>
createFlightCustomerGetListRequest bean
createFlightCustomerGetListRequest
Bean は、後続の SAP エンドポイントの RFC 呼び出しで使用される exchange メソッドで SAP リクエストオブジェクトをビルドします。次のコードスニペットは、リクエストオブジェクトを作成する一連の操作を示しています。
public void create(Exchange exchange) throws Exception { // Get SAP Endpoint to be called from context. SapSynchronousRfcDestinationEndpoint endpoint = exchange.getContext().getEndpoint("sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST", SapSynchronousRfcDestinationEndpoint.class); // Retrieve bean from message containing Flight Customer name to // look up. BookFlightRequest bookFlightRequest = exchange.getIn().getBody(BookFlightRequest.class); // Create SAP Request object from target endpoint. Structure request = endpoint.getRequest(); // Add Customer Name to request if set if (bookFlightRequest.getCustomerName() != null && bookFlightRequest.getCustomerName().length() > 0) { request.put("CUSTOMER_NAME", bookFlightRequest.getCustomerName()); } } else { throw new Exception("No Customer Name"); } // Put request object into body of exchange message. exchange.getIn().setBody(request); }
returnFlightCustomerInfo bean
returnFlightCustomerInfo
Bean は、前の SAP エンドポイントから受け取った exchange メソッドで、SAP レスポンスオブジェクトからデータを展開するロールを果たします。次のコードスニペットは、レスポンスオブジェクトからデータを抽出する一連の操作を示しています。
public void createFlightCustomerInfo(Exchange exchange) throws Exception { // Retrieve SAP response object from body of exchange message. Structure flightCustomerGetListResponse = exchange.getIn().getBody(Structure.class); if (flightCustomerGetListResponse == null) { throw new Exception("No Flight Customer Get List Response"); } // Check BAPI return parameter for errors @SuppressWarnings("unchecked") Table<Structure> bapiReturn = flightCustomerGetListResponse.get("RETURN", Table.class); Structure bapiReturnEntry = bapiReturn.get(0); if (bapiReturnEntry.get("TYPE", String.class) != "S") { String message = bapiReturnEntry.get("MESSAGE", String.class); throw new Exception("BAPI call failed: " + message); } // Get customer list table from response object. @SuppressWarnings("unchecked") Table<? extends Structure> customerList = flightCustomerGetListResponse.get("CUSTOMER_LIST", Table.class); if (customerList == null || customerList.size() == 0) { throw new Exception("No Customer Info."); } // Get Flight Customer data from first row of table. Structure customer = customerList.get(0); // Create bean to hold Flight Customer data. FlightCustomerInfo flightCustomerInfo = new FlightCustomerInfo(); // Get customer id from Flight Customer data and add to bean. String customerId = customer.get("CUSTOMERID", String.class); if (customerId != null) { flightCustomerInfo.setCustomerNumber(customerId); } ... // Put bean into body of exchange message. exchange.getIn().setHeader("flightCustomerInfo", flightCustomerInfo); }
290.14.2. 例 2: SAP へのデータの書き込み
概要
この例は、SAP で FlightTrip
ビジネスオブジェクトインスタンスを作成するルートを示しています。ルートは、FlightTrip
BAPI メソッド BAPI_FLTRIP_CREATE
を呼び出し、宛先エンドポイントを使用してオブジェクトを作成します。
ルートの Java DSL
サンプルルートの Java DSL は次のとおりです。
from("direct:createFlightTrip") .to("bean:createFlightTripRequest") .to("sap-srfc-destination:nplDest:BAPI_FLTRIP_CREATE?transacted=true") .to("bean:returnFlightTripResponse");
ルートの XML DSL
また、同じルートの Spring DSL は次のとおりです。
<route> <from uri="direct:createFlightTrip"/> <to uri="bean:createFlightTripRequest"/> <to uri="sap-srfc-destination:nplDest:BAPI_FLTRIP_CREATE?transacted=true"/> <to uri="bean:returnFlightTripResponse"/> </route>
トランザクションサポート
SAP エンドポイントの URL では、transacted
オプションが true
に設定されています。「トランザクションサポート」 で説明されているように、このオプションを有効にすると、エンドポイントは、RFC 呼び出しを呼び出す前に SAP トランザクションセッションが開始されていることを確認します。このエンドポイントの RFC は SAP で新しいデータを作成するため、ルートの変更を SAP で永続的にするには、このオプションが必要です。
リクエストパラメーターの設定
createFlightTripRequest
および returnFlightTripResponse
Bean は、前の例で示したのと同じ一連の操作に従って、リクエストパラメーターを SAP リクエストに入力し、SAP レスポンスからレスポンスパラメーターをそれぞれ展開します。
290.14.3. 例 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 ビーン
次のリストは、複雑な構造体パラメーター FLTINFO
のシリアル化された形式にマーシャリングする JAXB Bean を示しています。
@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; ... }