290.14. SAP 예


290.14.1. 예 1: SAP의 데이터

290.14.1. 개요

이 예제에서는 SAP에서 FlightCustomer 비즈니스 개체 데이터를 읽는 경로를 보여줍니다. 이 경로는 SAP 동기 RFC 대상 끝점을 사용하여 데이터를 검색하는 데 FlightCustomer BAPI 메서드인 BAPI_FLCUST_GETLIST 를 호출합니다.

290.14.2. 라우팅을 위한 Java DSL

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

from("direct:getFlightCustomerInfo")
    .to("bean:createFlightCustomerGetListRequest")
    .to("sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST")
    .to("bean:returnFlightCustomerInfo");

290.14.3. 라우팅을 위한 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>

290.14.4. createFlightCustomerGetListRequest bean

createFlightCustomerGetListRequest Quarkus는 후속 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);
}

290.14.5. returnFlightCustomerInfo bean

returnFlightCustomerInfo Quarkus는 이전 SAP 끝점에서 수신하는 교환 방법으로 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에 데이터 작성

290.14.6. 개요

이 예에서는 SAP에서 FlightTrip 비즈니스 개체 인스턴스를 생성하는 경로를 보여줍니다. 경로는 대상 끝점을 사용하여 오브젝트를 생성하여 FlightTrip BAPI 메서드 BAPI_FLTRIP_CREATE 를 호출합니다.

290.14.7. 라우팅을 위한 Java DSL

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

from("direct:createFlightTrip")
    .to("bean:createFlightTripRequest")
    .to("sap-srfc-destination:nplDest:BAPI_FLTRIP_CREATE?transacted=true")
    .to("bean:returnFlightTripResponse");

290.14.8. 라우팅을 위한 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>

290.14.9. 트랜잭션 지원

참고

SAP 엔드포인트의 URL에는 transacted 옵션이 true 로 설정되어 있습니다. 290.11절. “트랜잭션 지원” 에서 설명한 대로 이 옵션이 활성화되면 끝점은 RFC 호출을 호출하기 전에 SAP 트랜잭션 세션이 시작되었는지 확인합니다. 이 끝점의 RFC는 SAP에서 새 데이터를 생성하므로 SAP에서 경로를 영구적으로 변경하려면 이 옵션이 필요합니다.

290.14.10. 요청 매개변수 채우기

createFlightTripRequestreturnFlightTripResponse 빈은 요청 매개변수를 SAP 요청으로 채우고 SAP 응답에서 응답 매개 변수를 각각 추출하고 이전 예제에서 설명한 것과 동일한 작업 순서에 따라 각각 SAP 응답에서 응답 매개변수를 추출합니다.

290.14.3. 예 3: SAP에서 요청을 처리

290.14.11. 개요

이 예제에서는 경로에 의해 구현된 BOOK_FLIGHT RFC로의 SAP 요청을 처리하는 경로를 보여줍니다. 또한, 이는 구성 요소의 XML 직렬화 지원을 보여줍니다. 이 지원을 통해 CryostatB를 사용하여 SAP 요청 개체 및 응답 개체를 사용자 지정 빈에 분리하고 마샬링합니다.

이 경로는 여행 에이전트를 대신하여 FlightTrip 비즈니스 개체를 생성합니다. FlightCustomer. 이 경로는 먼저 SAP 서버 엔드포인트에서 수신한 SAP 요청 오브젝트를 사용자 지정 CryostatB 8080으로 묶습니다. 그런 다음 이 사용자 지정 8080은 트립션을 생성하는 데 필요한 여행 에이전트, 트래블 연결 및 여객 정보를 수집하는 3개의 하위 경로로 멀티 캐스트됩니다. 최종 하위 경로는 이전 예와 같이 SAP에서 여행 오브젝트를 생성합니다. 최종 하위 경로도 만들고 반환 하는 사용자 지정 CryostatB 8080은 SAP 응답 개체로 마샬링되고 서버 끝점에 의해 반환 됩니다.

290.14.12. 라우팅을 위한 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);

290.14.13. 라우팅을 위한 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>

290.14.14. BookFlightRequest bean

다음 목록에서는 직렬화된 형식의 SAP BOOK_FLIGHT 요청 오브젝트에서 요약하지 않는 CryostatB 8080을 보여줍니다.

@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;

    ...
}

290.14.15. BookFlightResponse bean

다음 목록은 SAP BOOK_FLIGHT 응답 오브젝트의 직렬화된 형식으로 마샬링하는 CryostatB 8080을 보여줍니다.

@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;

    ...
}
참고

응답 오브젝트의 complex 매개변수 필드는 응답의 하위 요소로 직렬화됩니다.

290.14.16. FlightInfo bean

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

@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;

    ...
}

290.14.17. ConnectionInfoTable 8080

다음 목록은 복잡한 테이블 매개변수인 CONNINFO 의 직렬화된 형식으로 마샬링하는 CryostatB 8080을 보여줍니다.

참고

CryostatB 8080의 루트 요소 유형의 이름은 _ Cryostat로 접미사가 지정된 행 구조 유형의 이름에 해당하며, Cryostat에는 행 요소 목록이 포함됩니다.

@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;

    ...
}

290.14.18. ConnectionInfo bean

다음 목록은 위의 테이블 행 요소의 직렬화된 형식으로 마샬링하는 CryostatB 8080을 보여줍니다.

@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;

    ...
}
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.