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 unBusinessPartnerService
, aHttpDestination
y unBusinessPartner
como ejecutar un comando probado.
Dentro del modo de ejecución (), es decir, siempre que se ejecuta el comando, llama albusinesspartner service
.El es
StoreBusinessPartnerCommand
toma unaBusinesspartner
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 elBusinessPartner
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
yBusinessPartnerAddresses
que está nuevamente conectado a cero a muchosEMailAddresses
:
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
yBasá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.