119.12. 示例 1:从 SAP 读取数据
本例演示了一个从 SAP 读取 FlightCustomer 业务对象数据的路由。该路由调用 FlightCustomer BAPI 方法,即 BAPI_FLCUST_GETLIST,使用 SAP 同步 RFC 目标端点来检索数据。
119.12.1. 用于路由的 Java DSL 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
示例路由的 Java DSL 如下:
from("direct:getFlightCustomerInfo")
.to("bean:createFlightCustomerGetListRequest")
.to("sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST")
.to("bean:returnFlightCustomerInfo");
119.12.2. 用于路由的 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>
119.12.3. createFlightCustomerGetListRequest bean 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
createFlightCustomerGetListRequest bean 负责在其后续 SAP 端点的 RFC 调用中使用的交换方法中构建 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);
}
119.12.4. returnFlightCustomerInfo bean 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
returnFlightCustomerInfo bean 负责从 SAP 响应对象中提取数据,在其从之前的 SAP 端点接收的 Exchange 方法中提取数据。以下代码片段演示了从响应对象中提取数据的操作序列:
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);
}