Saltar al contenido

Cree e inserte en profundidad con el modelo de datos virtual para OData

Para empezar, primero crea una nueva clase llamada StoreBusinessPartnerCommand. Actuará como un lugar único para recibir las órdenes que necesitamos ejecutar. Si ha realizado nuestros tutoriales antes, el siguiente código puede resultarle muy familiar.

El archivo debe colocarse debajo de su <projectroot>/application/src/main/java/com/sap/cloud/sdk/tutorial directorio.

package com.sap.cloud.sdk.tutorial;

import com.sap.cloud.sdk.cloudplatform.connectivity.HttpDestination;
import com.sap.cloud.sdk.cloudplatform.resilience.ResilienceConfiguration;
import com.sap.cloud.sdk.cloudplatform.resilience.ResilienceDecorator;
import com.sap.cloud.sdk.cloudplatform.resilience.ResilienceRuntimeException;
import com.sap.cloud.sdk.odatav2.connectivity.ODataException;
import com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.businesspartner.BusinessPartner;
import com.sap.cloud.sdk.s4hana.datamodel.odata.services.BusinessPartnerService;

public class StoreBusinessPartnerCommand{

    private final BusinessPartnerService businessPartnerService;
    private final BusinessPartner businessPartner;
    private final HttpDestination httpDestination;

    public StoreBusinessPartnerCommand(HttpDestination httpDestination, BusinessPartnerService businessPartnerService, BusinessPartner businessPartner) {
        this.businessPartnerService = businessPartnerService;
        this.businessPartner = businessPartner;
        this.httpDestination = httpDestination;
    }

    public BusinessPartner execute() {
        return ResilienceDecorator.executeSupplier(this::run, ResilienceConfiguration.of(GetBusinessPartnersCommand.class));
    }

    private BusinessPartner run() {
        try {
            return businessPartnerService
                    .createBusinessPartner(businessPartner)
                    .execute(httpDestination);
        } catch (final ODataException e) {
            throw new ResilienceRuntimeException(e);
        }
    }
}

¿Qué hace el código?

El código da un StoreBusinessPartnerCommand quien usa un BusinessPartnerService, a HttpDestination y un BusinessPartner como ejecutar un comando probado.
Dentro del modo de ejecución (), es decir, siempre que se ejecuta el comando, llama al businesspartner service.

El es StoreBusinessPartnerCommand toma una Businesspartner como entrada. Este es un tipo de datos que pueden ser complejos (que contienen entidades anidadas). Por lo tanto, en el siguiente paso debe crear una estructura de datos anidada basada en el BusinessPartner modelo de datos.

La estructura que le interesa se presenta a continuación. La entidad raíz es el socio comercial conectado a cero a muchos BusinessPartnerRoles y BusinessPartnerAddresses que está nuevamente conectado a cero a muchos EMailAddresses:

Para ello, está creando un nuevo servlet simple que revela un método POST para nuestros clientes.

package com.sap.cloud.sdk.tutorial;

import com.google.gson.Gson;
import com.sap.cloud.sdk.cloudplatform.connectivity.DestinationAccessor;
import com.sap.cloud.sdk.cloudplatform.connectivity.HttpDestination;
import com.sap.cloud.sdk.s4hana.connectivity.DefaultErpHttpDestination;
import com.sap.cloud.sdk.s4hana.connectivity.ErpHttpDestination;
import com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.businesspartner.AddressEmailAddress;
import com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.businesspartner.BusinessPartner;
import com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.businesspartner.BusinessPartnerAddress;
import com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.businesspartner.BusinessPartnerRole;
import com.sap.cloud.sdk.s4hana.datamodel.odata.services.DefaultBusinessPartnerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/businessPartners")
public class BusinessPartnerServlet extends HttpServlet {

    private static final Logger logger = LoggerFactory.getLogger(BusinessPartnerServlet.class);
    private static final String DESTINATION_NAME = "MyErpSystem";

    @Override
    protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
        throws ServletException, IOException {

        try {
            final ErpHttpDestination destination = DestinationAccessor.getDestination(DESTINATION_NAME).asHttp().decorate(DefaultErpHttpDestination::new);
            final List<BusinessPartner> businessPartners = new GetBusinessPartnersCommand(destination).execute();

            response.setContentType("application/json");
            response.getWriter().write(new Gson().toJson(businessPartners));

        } catch (final Exception e) {
            logger.error(e.getMessage(), e);
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            response.getWriter().write(e.getMessage());
            e.printStackTrace(response.getWriter());
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        final String firstname = request.getParameter("firstname");
        final String lastname = request.getParameter("lastname");
        final String country = request.getParameter("country");
        final String city = request.getParameter("city");
        final String email = request.getParameter("email");

        //do consistency checks here...

        final AddressEmailAddress emailAddress = AddressEmailAddress.builder()
                .emailAddress(email)
                .build();

        final BusinessPartnerAddress businessPartnerAddress = BusinessPartnerAddress.builder()
                .country(country)
                .cityName(city)
                .emailAddress(emailAddress)
                .build();

        final BusinessPartnerRole businessPartnerRole = BusinessPartnerRole.builder()
                .businessPartnerRole("FLCU01")
                .build();

        final BusinessPartner businessPartner = BusinessPartner.builder()
                .firstName(firstname)
                .lastName(lastname)
                .businessPartnerCategory("1")
                .correspondenceLanguage("EN")
                .businessPartnerAddress(businessPartnerAddress)
                .businessPartnerRole(businessPartnerRole)
                .build();

        String responseBody;

        try {
            final HttpDestination httpDestination = DestinationAccessor.getDestination(DESTINATION_NAME).asHttp();
            final BusinessPartner storedBusinessPartner = new StoreBusinessPartnerCommand(httpDestination, new DefaultBusinessPartnerService(), businessPartner).execute();

            responseBody = new Gson().toJson(storedBusinessPartner);
            response.setStatus(HttpServletResponse.SC_CREATED);

        } catch (final Exception e) {
            logger.error(e.getMessage(), e);
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            responseBody = e.getMessage();
        }

        response.setContentType("application/json");
        response.getOutputStream().print(responseBody);
    }
}

¿Qué hace el código?

Implementa el nuevo código de Servlet que se revela en businessPartner Ruta URL. Se espera que se establezcan cinco parámetros: firstname, lastname, country, city y e-mail. Por razones de legibilidad, omite datos para verificar que estos parámetros estén realmente configurados y arroja los mensajes de error correspondientes al cliente, que es una característica que definitivamente debe hacer en cualquier código productivo.

Basándose en los cinco parámetros de entrada, está creando las distintas entidades.

  • Primero, una entidad para almacenar la dirección de correo electrónico utilizando el método de patrón de construcción revelado.

  • En segundo lugar, crea uno BusinessPartnerAddress según el parámetro de ciudad y país, así como las direcciones de correo electrónico de la entidad desde el primer paso.

  • En tercer lugar, crea un rol de socio comercial utilizando el rol FLCU01 (que realmente significa un cliente).

  • Cuarto, la entidad socio comercial final que consume los parámetros restantes y la entidad de los pasos anteriores.

  • Eventualmente, usas el StoreBusinessPartnerCommand para almacenar la entidad de socio comercial probada. Como resultado, obtiene la entidad almacenada enriquecida con ID que ingresará al sistema S / 4HANA.

En una excepción, simplemente restaure el mensaje de error, ignorando cualquier letra pequeña o formato JSON aquí por razones de simplicidad.

Puede implementar el código creado anteriormente en SAP Cloud Platform o en una ubicación local (considere tutoriales anteriores como Crear una aplicación de muestra en Cloud Foundry usando SAP Cloud SDK).

Para ejecutarlo en una casa local, ejecute lo siguiente:

 mvn clean install
 mvn tomee:run -pl application

Luego, puede usar una herramienta como Postman o Curl para verificar si el código está funcionando. Como puede ver en este ejemplo, el socio comercial se ha contabilizado correctamente y tiene una BusinessPartner ID y UUID, enriquecidos con S / 4HANA.

captura de pantalla

Hecho

Inicie sesión para responder la pregunta