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;
...
}