These are the release notes of the SAP Cloud SDK for Java. You may also be interested in the release notes of the SDK for JavaScript.
Note: The SAP Cloud SDK was previously known as SAP S/4HANA Cloud SDK.
June 18, 2020 - Maven Central - Javadoc - Release blog
SoapRequest(Class<ServiceT>, Destination) is deprecated in favor of SoapRequest(Class<ServiceT>, HttpDestination) because SOAP API invocations always use the HTTP protocol.ODataRequestBatch in version agnostic module odata-client. This implementation combined batching of entity read and modification requests. Modifications are grouped within changesets and, depending on the service implementation, they are expected to rollback if a change in the set was unsuccessful. Multiple changesets and read requests can be attached. The class supports entity request handling for create, read, update and delete, as well as service specific functions and actions.@Beta. Please refrain from using it in productive application code.HttpResponse object can be accessed.HttpClient httpClient = getHttpClient();
ODataRequestRead read1 = getReadReq();
ODataRequestCreate create2 = getCreateReq();
ODataRequestUpdate update3 = getUpdateReq();
ODataRequestBatch batchRequest =
new ODataRequestBatch( "service-path/", ODataProtocol.V4 )
.addRead( read1 )
.beginChangeset()
.addCreate( create2 )
.addUpdate( update3 )
.endChangeset();
batchRequest.execute( httpClient );
ScpCfDestinationLoader.tryGetAllDestinations(DestinationOptions options) to fetch all Cloud Foundry destinations. Destinations at service instance level are prioritized over destinations on subaccount level in case of a name conflict.June 4, 2020 - Maven Central - Javadoc - Release blog
CloudPlatform with the method setEnvironmentVariableReader(Function<String, String>) allowing adjustments in the way how environment variables are read.com.sap.cloud.sdk.datamodel.odata.client.expression allowing custom requests to have entity-independent, yet type-safe query filters.3.10.2 to 3.10.30.5.6 to 0.6.03.15.0 to 3.16.15.2.5.RELEASE to 5.2.6.RELEASE5.3.1.RELEASE to 5.3.2.RELEASE6.1.2.Final to 6.1.5.Final4.1.49.Final to 4.1.50.Final4.2to 4.2.13.11.4 to3.12.1spring-boot in archetype scp-cf-spring from 2.2.6.RELEASE to 2.3.0.RELEASEscp.sdkVersion in archetype scp-neo-javaee7 from 1.72.13 to 1.74.10DestinationAccessException occured.May 21, 2020 - Maven Central - Javadoc - Release blog
Resilience4jDecorationStrategy to enable custom function decoration properties.ServiceWithNavigableEntities for recursive traversal of navigation properties in entity sets that are part of an OData v4 virtual data model (VDM). This generic type offers type-safe methods to create a request along chained entities with their navigation properties. By delegating to the existing request builder classes, the interface supports all basic CRUD operations (create, read, update, delete), plus count. All existing request modifiers are supported (e.g. filter or select statements in Read). The methods and sub-types in this interface are still open for changes in the future.POST /ODataService/People('John')/Vacations(2020)/TripsTrip tripItem = createTrip();
CreateRequestBuilder createRequest = service
.forEntity( Person.builder().username("John").build() )
.navigateTo( Person.VACATIONS )
.forEntity( Vacation.builder().id(2020).build() )
.navigateTo( Vacation.TRIPS )
.create( tripItem );
createRequest.execute( destination );
getApplicationUrl() and getApplicationProcessId() in the interface CloudPlatform and add implementation for Cloud Foundry in the implementing class ScpCfCloudPlatform to partially match the existing public API of the inplementing class for NEO ScpNeoCloudPlatform.odata-v4-client to odata-client and packages contained from c.s.c.s.datamodel.odatav4.client to c.s.c.s.datamodel.odata.client. Only API that is declared unstable is affected. Changes in your projects are only required if unstable parts of the API are being used explicitly.odata-generator, odata-generator-cli, and odata-generator-maven-plugin) is now able to parse swagger files according to the OpenAPI v3 specification.May 7, 2020 - Maven Central - Javadoc - Release blog
MaintenanceItemObjList in the Inbound Delivery (A2X) - API_INBOUND_DELIVERY_SRV_0002 API, were removed from SAP API Business Hub as part of the newest release 2005 of SAP S/4HANA Cloud. There operations were also removed from the OData Virtual Data Model (VDM) for SAP S/4 HANA Cloud.final HttpDestination httpDestination = DestinationAccessor.getDestination(destinationName).asHttp();
final List<WorkflowDefinition> workflowDefinitions =
new WorkflowDefinitionsApi(httpDestination).getWorkflowDefinitions();<dependency>
<groupId>com.sap.cloud.sdk.services</groupId>
<artifactId>scp-workflow-cf</artifactId>
</dependency>Long, which is the number of matching entries according to optional filter and search expressions.long numEntries = new DefaultEntityService()
.countEntities()
.filter(SomeEntity.FIELDNAME.contains("foo"))
.search("bar")
.execute(someDestination);long numEntries = new CountRequestBuilder<>("/odata/service/path/", SomeEntity.class)
.filter(SomeEntity.FIELDNAME.contains("foo"))
.search("bar")
.execute(someDestination);DeleteRequestBuilder and UpdateRequestBuilder.disableVersionIdentifier() allows to avoid that the request header If-Match is sent at all.matchAnyVersionIdentifier() allows to control that the request header If-Match is sent with the value *.new DefaultEntityService()
.deleteEntity(entity)
.disableVersionIdentifier()
.execute(destination);* value in the request header: new DefaultEntityService()
.updateEntity(entity)
.matchAnyVersionIdentifier()
.execute(destination);28.2-jre to 29.0-jre3.3.5 to 3.3.62.6.1 to 2.6.22.10.3 to 2.11.01.3.1 to 1.4.03.3.0 to 3.4.02.4.0.RELEASE to 2.4.1.RELEASE2.0.0 to 2.1.04.1.48.Final to 4.1.49.Finalscp-cf-tomee:tomee-maven-plugin from 7.0.5 to 8.0.1scp-cf-spring:spring-boot-maven-plugin from 2.2.5.RELEASE to 2.2.6.RELEASEscp-neo-javaee7:jacoco-maven-plugin from 0.8.2 to 0.8.5maven-surefire-plugin from 3.0.0-M3 to 3.0.0-M4April 23, 2020 - Maven Central - Javadoc - Release blog
com.sap.cloud.sdk.quality:pmd-plugin was removed. From now on, the ruleset com.sap.cloud.sdk.quality:pmd-rules contains only the rules shipped with the SAP Cloud SDK. All other imported rules were removed. To keep using the ruleset with the standard pmd plugin, for example with SAP Cloud SDK for Continuous Delivery, we recommend adding the following configuration to the root pom.xml of your project:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<configuration>
<rulesets>
<ruleset>rulesets/cloud-sdk-qualities.xml</ruleset>
<ruleset>rulesets/java/maven-pmd-plugin-default.xml</ruleset>
</rulesets>
</configuration>
<dependencies>
<dependency>
<groupId>com.sap.cloud.sdk.quality</groupId>
<artifactId>pmd-rules</artifactId>
<version>3.18.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>5.3.0.RELEASE to 5.3.1.RELEASE0.5.5 to 0.5.63.10.1 to 3.10.22.5.3 to 2.6.0April 15, 2020 - Maven Central - Javadoc -
CustomOperationRequestBuilder class has been renamed to FunctionRequestBuilderbroker and one with service plan application.April 9, 2020 - Maven Central - Javadoc - Release blog
modifyingEntity() and not with replacingEntity().orderBy() and passing fields to it with the corresponding order.
getPersons().orderBy(Person.FIRST_NAME.asc(), Person.LAST_NAME.desc());ResilienceDecorationStrategy now provides an additional optional argument to pass a custom ExecutorService in methods decorateCallable() and decorateSupplier(). This way the thread pool and task execution can be adjusted upon decoration. If the time limiter is enabled, it will be running in a thread through the passed executor. If Callable or Supplier lambda is queued, then the asynchronous task will be run with the given ExecutorService as well.3.10.0 to 3.10.13.3.0 to 3.3.12.26.2 to 2.26.35.2.2.RELEASE to 5.3.0.RELEASE4.1.47.Final to 4.1.48.Final7.0.6 to 7.0.71.38.0 to 1.39.02.5.1 to 2.5.33.9 to 3.105.6.0 to 5.6.10.5.4 to 0.5.55.2.4.RELEASE to 5.2.5.RELEASEscp-cf-spring, scp-cf-tomee, and scp-neo-javaee7:jacoco-maven-plugin to 0.8.5maven-surefire-plugin to 3.0.0-M4maven-enforcer-plugin to 3.0.0-M3maven-war-plugin to 3.2.3maven-dependency-plugin to 3.1.22.2.1.RELEASE to 2.2.5.RELEASEodata-v4-generator where the field type Edm.TimeOfDay was not recognized and not generated properly, leading to missing SimpleProperty fields on the generated entity.3.16.1 where public keys for token validation were not cached.March 26, 2020 - Maven Central - Javadoc - Release blog
getCustomField("fieldName").issuer and jku properties. Public keys for signature verification are fetched from the URL specified by the jku property. This only works if the issuer domain matches the domain of the XSUAA service. In case this fails or if the properties are not set, the implementation falls back to the previous validation mechanisms (e.g. verification key of XSUAA service binding, XSUAA token endpoint provider).pom.xml and recompile. If everything compiles and behaves as expected locally, you can configure Cloud Foundry to use Java 11 too. See this page for more details how to do that.1.7.26 to 1.7.302.10.2 to 2.10.32.26.1 to 2.26.29.4.26.v20200117 to 9.4.27.v202002275.2.3.RELEASE to 5.2.4.RELEASE4.5.11 to 4.5.12Principal Propagation for on-premises connectivity on Cloud Foundry.? in the service path# and & in filter and select expressions' in string literals and in string parameters being passed in functions and GetByKey requests" and \ in search expressionsMarch 12, 2020 - Maven Central - Javadoc - Release blog
SubdomainReplacer and DefaultSubdomainReplacer became obsolete and were removed. The usage of this classes was replaced by the new library.XsuaaService has been changed.
The old behavior is implemented in following methods.
The change was made in order to better reflect on the internal logic of these methods. In addition to "Token Grant", the "Token Exchange" flavored operation will perform an authorization request with "Refresh Token" flow, which is required for Principal Propagation when manually consuming the CloudFoundry Connectivity Service. Please update your code accordingly.com.sap.cloud.sdk.services:blockchain has been renamed to com.sap.cloud.sdk.services:blockchain-client-multichain to better reflect its focus on the Multichain Service.execute() on all request builders (e.g., CreateRequestBuilder)select(), filter(), top(), skip(), and search() on GetAllRequestBuilderGetByKeyRequestBuilder.select()of(), and(), or(), not() for defining a SearchExpressionincludingFields(), replacingEntity(), modifyingEntity() on UpdateRequestBuilderODataExceptionNavigationProperty, ComplexProperty and SimplePropertyComplexProperty fields on entities that can be used to build queries. Single instances and collections of complex types are supported.1.26 as direct dependency and exclude the one used by the jackson library to overcome the security vulnerability CVE-2017-18640.2.5.1. See the compatibility notes for details.1.37.1 to 1.38.01.18.10 to 1.18.122.8.0 to 2.8.11.7 to 1.84.5.10 to 4.5.112.7.5 to 2.7.63.6.3 to 3.8.61.2.0 to 1.3.15.5.2 to 5.6.00.5.1 to 0.5.49.4.25.v20191220 to 9.4.26.v202001175.2.1.RELEASE to 5.2.2.RELEASE6.0.17.Final to 6.1.2.Final3.9.0 to 3.10.03.14.0 to 3.15.03.2.4 to 3.3.02.20.0 to 2.26.11.69.18' in String literals correctly. This character can now be used as part of entity keys and filter expressions.Decimal OData values being formatted in unexpected scientific notation (e.g. 4.2e-7) instead of expected decimal form (e.g. 0.00000042). The solution is provided for serializing entity properties of Java type BigDecimal.February 27, 2020 - Maven Central - Javadoc - Release blog
com.sap.cloud.sdk.cloudplatform.connectivity.DestinationRetrievalStrategy as it had no usage in the realm of the SAP Cloud SDK version 3.odata-v4-generator in your .pom file.1.36.2 to 1.37.1February 13, 2020 - Maven Central - Javadoc - Release blog
WorkItems in the service Commercial Project - Read is no longer allowed as of SAP S/4HANA Cloud release 2002. The method updateWorkItem() was removed from CommercialProjectService.4.3.26.RELEASE to overcome the security vulnerability CVE-2020-5397.January 30, 2020 - Maven Central - Javadoc - Release blog
MultichainRequest.MultichainService instance using a SAP Cloud Platform destination, the destination's HTTP client will now be used as a pre-configured HttpClient instance with authentication, HTTP connection pooling, etc. for each MultichainRequest.2.10.1 to 2.10.21.13 to 1.144.4.12 to 4.4.13.3.3.4 to 3.3.50.4.2 to 0.5.15.2.2.RELEASE to 5.2.3.RELEASE.edmx file, the ones without such annotations got no operations resolved at all.BapiRequest where a NoSuchElementException was thrown in case a Destination without a name was used.#, &, etc. in OData filter expressions.January 16, 2020 - Maven Central - Javadoc - Release blog
PrincipalAccessor is no longer an indicator for a JWT to be present. Due to the introduction of BasicAuthenticationAccessor a principal can also originate from the Basic Authentication header on the current request. As before verifying authentication and authorizations needs to be done explicitly by the application using the SAP Cloud SDK.BasicAuthenticationAccessor to read the username and password from the Basic Authentication header of the currently incoming request on Cloud Foundry.PrincipalAccessor to also read the current principal from the newly introduced BasicAuthenticationAccessor, in addition to the already existing way to read it from the current JWT. This functionality applies to Cloud Foundry. A valid JWT takes precedence over a Basic Authentication header..cer, .crt, and .der) as trust store locations for HTTPS destinations.SAP-Connectivity-Authentication and Proxy-Authorization for on-premise requests, the SAP Cloud SDK now takes the recommended approach of just using Proxy-Authorization with a dynamicly resolved User Exchange Access Token.PrincipalPropagationStrategy for configuring that the previous behavior should be used.7.0.5 to 7.0.61.36.1 to 1.36.20.1.0 to 0.2.03.2.0 to 3.2.45.2.1.RELEASE to 5.2.2.RELEASE28.1-jre to 28.2-jre3.8.3 to 3.9.04.12 to 4.139.4.19.v20190610 to 9.4.25.v201912201.44.12 to 1.65.15ResilienceDecorator invalidating itself upon calling, when using a JCache SPI different from JCache RI.PATCH semantics where null values were being filtered out before the update. Explicitly set null values are being retained now.String parameter as reported here.December 19, 2019 - Maven Central - Javadoc - Release blog
uri() in builders of ScpCfHttpDestination, DefaultHttpDestination and DefaultErpHttpDestination has been deprecated, as this parameter is already passed to create the builder instance.network() in builders of DefaultHttpDestination and DefaultErpHttpDestination has been deprecated in favour of using proxyType instead.keyStorePassword() in builders of DefaultHttpDestination and DefaultErpHttpDestination has been deprecated.ScpCfHttpDestination for the properties header, user, password.ScpNeoHttpDestination for the properties user, password, trustAllCertificates, header, authenticationHeaders, basicCredentials, authenticationType, proxyType, proxyConfiguration.DefaultHttpDestination and DefaultErpHttpDestination for the properties basicCredentials, proxyType.Edm.Time, Edm.DateTime or Edm.DateTimeOffset.December 5, 2019 - Maven Central - Javadoc - Release blog
scp-blockchain module: The return type of MultichainService.getDestination() changes to MultichainBasicAuthDestination to support Basic Authentication. If you use this method please adapt to the new return type.MultichainRequest, allowing the request to be used with AWS and Azure Multichain nodes.cloudsdk-resilience-<number>DestinationProperties.getPropertyNames() to retrieve the set of properties of a destination. This allows you to enumerate the names of all properties retrieved from the destination service and their values./) were incorrectly escaped in OData requests made when dynamically fetching a navigation property of an entity whose key contains such characters.November 21, 2019 - Maven Central - Javadoc - Release blog
Resilience4jDecorationStrategy have been changed to accept generic modular decorators for the following properties. The default behavior has not been changed. This should not affect existing code, but you may need to recompile your code.November 7, 2019 - Maven Central - Javadoc - Release blog
RetryConfiguration.ofDefaults() has been deprecated in favor of RetryConfiguration.of(maxAttempts) to avoid unexpected, implicit behavior.executeFutureSupplier and decorateFutureSupplier have been removed from ResilienceDecorationStrategy and ResilienceDecorator.CircuitBreakerConfiguration have been changed as follows:ResilienceConfiguration with a CacheConfiguration in place. Use ResilienceDecorator.invalidateCache(configuration) to clear the cache associated with a specific configuration.--copyright-header your-custom-header. By default, no header is generated.CircuitBreakerConfiguration. Use CircuitBreakerConfiguration.closedBufferSize and CircuitBreakerConfiguration.halfOpenBufferSize to provide custom values for the respective buffer size.CacheConfiguration in ResilienceConfiguration. Use withExpirationStrategy(strategy) on the builder for a CacheConfiguration with the enum constants available from CacheExpirationStrategy. WHEN_LAST_MODIFIED remains the default value for the expiration strategy.ResilienceConfiguration.empty to initialize a new resilience configuration with all properties being disabled by default.TimeLimiterConfiguration.of(duration) as a convenience instead of TimeLimiterConfiguration.of().timeoutDuration(duration).October 24, 2019 - Maven Central - Javadoc - Release blog
getJsonResponseObjectName() of base class FluentHelperFunction has been deprecated in favor of its successor refineJsonResponse. Both reside in protected scope and are therefore only used to customize the default behavior. The new method allows limitless modification of the response JSON element during the refinement step of the deserialization process for function import responses.ResilienceConfiguration via a RetryConfiguration.odata-generator-maven-plugin. For this feature just add the property <compileScope>...</compileScope> with the compilation phase to your configuration. Valid values are COMPILE, TEST_COMPILE, and NONE, representing the different compile phases or no automatic compilation at all. The default value (for backwards compatibility reasons) is NONE.October 10, 2019 - Maven Central - Javadoc - Release blog
Bearer" was spelled in title case. Now, corresponding methods do a case insensitive check for "bearer". That means, "bearer" and "Bearer" are now equally supported as correct authorization header.user_name claim of the current JWT in ScpCfPrincipalFacade when the JWT has the user_token grant type.2.9.9/2.9.9.2 to 2.9.10.artifactId does not contain an underscore character when creating a project using the scp-cf-spring and scp-cf-tomee archetypes. This is necessary as the artifact ID will also be used as Cloud Foundry application name and the deployment to Cloud Foundry will fail if the application name contains an underscore.September 26, 2019 - Maven Central - Javadoc - Release blog
rest-assured from the sdk-bom. Projects that depends on it must now declare a version explicitly. This also removes the need to explicitly declare a version of hamcrest-core and hamcrest-library since they were previously both introduced as transitive dependencies via jUnit and rest-assured but had conflicting versions.SystemUser property in destinations with authentication type "OAuth2SAMLBearerAssertion". The system user will be used instead of the currently logged in principal to retrieve an access token to the destination. That is, no principal propagation takes place. As a consequence, no user JWT is required.September 12, 2019 - Maven Central - Javadoc - Release blog
com.sap.cloud.servicesdk.*) from version 1.32.5 to 1.33.0.commons-beanutils to 1.9.4 (from 1.9.3) in order to fix CVE-2019-10086.listeners-all dependencies from projects generated via archetypes since the SAP Cloud SDK Pipeline will inject this dependency during a pipeline run.August 29, 2019 - Maven Central - Javadoc - Release blog
decorateFutureSupplier and executeFutureSupplier in ResilienceDecorator, decorateFutureSupplier and executeFutureSupplier in ResilienceDecorationStrategy.ChangeMasterService, ProcessOrderConfirmationService, and ProductionOrderConfirmationService. Take a look at the corresponding Javadoc and use the appropriate successor service listed therein.queueCallable and queueSupplier of ResilienceDecorator that return instances of CompletableFuture. Corresponding methods are also available from ResilienceDecorationStrategy.com.sap.cloud.servicesdk.*) from version 1.32.0 to 1.32.5ThreadContextExecutor and the accessor classes that use it (e.g. execute... methods in TenantAccessor).XsuaaService where it always forcibly used the provider tenant when calling retrieveAccessToken... methods. Now the methods retrieve access tokens for the tenant that called the method.MultichainService so that it appropriately throws instances of MultichainException.August 15, 2019 - Maven Central - Javadoc - Release blog
OutboundDeliveryService has been removed from the SAP API Business Hub and, as a consequence, from the SDK. Use OutboundDeliveryV2Service instead.attachToService method of VdmEntity is now mandatory (@Nonnull), rather than nullable, because attaching to a service does not work without a destination to designate the target system.com.sap.cloud.sdk.s4hana.datamodel.odata.services), new operations in previously existing services, and new entity types. The SDK supports all OData services listed in the SAP API Business Hub for SAP S/4HANA Cloud.com.sap.cloud.sdk.s4hana.datamodel.messaging.api.message). The SDK supports all event types listed in the SAP API Business Hub for SAP S/4HANA Cloud.DefaultHttpDestination failed to load the authentication type, so that authentication was not correctly applied when loading destinations from environment variable or instantiating DefaultHttpDestination manually.August 1, 2019 - Maven Central - Javadoc - Release blog
destinations, version 3.0.0 does not use basic authentication even if credentials are given. Either update to version 3.1.0 or manually add the following properties to the JSON defining a destination: "authentication": "BasicAuthentication", "authType": "BasicAuthentication".
The new major version 3.0.0 brings many improvements, modernizes the SDK, and lays the groundwork for the future evolution of the SDK and SAP Cloud Platform. As a new major version, pay particular note to the compabilitiy notes below and our migration guide. You can jump directly to the sections about destinations, resilience, running outside of requests, principal instead of user, renamed modules, and updated dependencies.
Destination, HttpDestination and RfcDestination), default and platform-specific implementations (such as DefaultHttpDestination, ScpCfHttpDestination, or ScpNeoHttpDestination), and decorators for dynamically translating between the different types.
DestinationProperties.ErpConfigContext. Instead, provide a destination of an appropriate type (HTTP or RFC) directly where previously an ErpConfigContext was used, like in the OData VDM. Destinations can be fetched as before from the DestinationAccessor and translated into the required type using the convenience methods asHttp and asRfc.DestinationAccessor. Instead, provide the retrieval strategy as an additional configuration parameter of type DestinationOptions when loading a destination.
DestinationOptions using the ScpCfDestinationOptionsAugmenter or ScpNeoDestinationOptionsAugmenter with the appropriate strategy applied.ScpCfDestinationRetrievalStrategy and ScpNeoDestinationRetrievalStrategy for destination retrieval strategy.PLATFORM_DEFAULT value from all destination retrieval strategy enums. Use null values instead, or do not set the parameter at all.DestinationAccessor.getLoader().tryGetDestination(destinationName,
DestinationOptions.builder()
.augmentBuilder(ScpCfDestinationOptionsAugmenter.augmenter()
.retrievalStrategy(ScpCfDestinationRetrievalStrategy.ALWAYS_PROVIDER))
.build()
);
ResilienceDecorator class to wrap logic instead of extending the Command class.ResilienceConfiguration class instead of passing options to the constructor of a super class.
ResilienceDecorator requires at least an unique identifier to be part of the configuration.ResilienceDecorator with a custom function decoration strategy by implementing the ResilienceDecorationStrategy interface.Command and ErpCommand. Wrap the logic previously contained in commands using the execute and decorate methods of ResilienceDecorator.CachingCommand and CachingErpCommand. Instead, configure caching within the ResilienceConfiguration class by providing an instance of CacheConfiguration to cacheConfiguration.
CacheConfiguration requires at least a value for the duration after which the cache entry shall expire.parameters.
If these items are Serializable, then the cache key itself automatically becomes serializable as well.
This fulfills a requirement for some caching configurations.caffeine as a dependency.ODataServicesQueryCommand, SqlQueryCommand, BapiQueryCommand, RfcQueryCommand.
The execute method of queries can be easily wrapped using the execute and decorate methods of ResilienceDecorator instead.asResilientCommand methods from all VDM fluent helpers.
The execute method of VDM fluent helpers can be easily wrapped using ResilienceDecorator instead.ODataRequestCommand since it's no longer needed by VDM fluent helpers.RequestContext concept into ThreadContext and reduce dependencies on the Servlet standard to enable an easier use of the SDK in more environments and outside of HTTP requests, also if no explicit tenant or user are available. Also, rework the various accessors to consistently offer options for override and fallback in non-standard use cases.
RequestContextto ThreadContext and adapt it to be applicable in non-request contexts.
ThreadContextExecutor.ThreadContextDecorator to allow decorating the callable which is wrapped in a ThreadContext.
The difference to ThreadContextListener is that the listener is responsible for setting ThreadContext properties while the decorator allows to decorate the callable that is wrapped in the ThreadContext.RequestContextServletFilter to RequestAccessorFilter to better reflect its purpose.DestinationsRequestContextListener has been renamed to HttpClientsThreadContextListener to better reflect its purpose.USE_MOCKED_TENANT, USE_MOCKED_USER, and ALLOW_MOCKED_AUTH_HEADER are no longer needed and ignored.TenantNotAvailableException etc. were removed and replaced with return values of type Option that inherently indicate (non-)availability.LocalScopePrefixProvider now uses Vavr Try instead of throwing exceptions which were previously not declared on the API.TenantAccessor, PrincipalAccessor, AuthTokenAccessor, and RequestAccessor consistent and use Vavr Try where applicable.JwtBasedRequestContextExecutor. Use AuthTokenAccessor.executeWithAuthToken in combination with AuthTokenBuilder instead. For running code on behalf of another tenant, use TenantAccessor.executeWithTenant.security-servlet.
Note that this may require that you add the following dependency to your project if you rely on these web filters:<dependency>
<groupId>com.sap.cloud.sdk.cloudplatform</groupId>
<artifactId>security-servlet</artifactId>
</dependency>
User with the more general Principal.
Locale from Principal interface as this is only available on Neo (type-cast to ScpNeoPrincipal if you need to access this value).hasAuthorization method, use getAuthorizations and call the contains method on the returned set instead.CacheKey and CacheManager accordingly by replacing all occurences of "user" with "principal".Principal also in AccessDeniedException instead of User. Note, however, that the AccessDeniedResponse still exposes "user" to remain compatible on REST API level).io.vavr.control.Try in more places and replacing java.util.Optional with io.vavr.control.Option. If you want to continue using Java's Optional, use toJavaOptional() on the returned Option.CloudLoggerFactory. Use the plain slf4j LoggerFactory instead.MockUtil class.
MockUtil no longer mocks platform-specific classes, but only interfaces.
Mock the facade manually, if you have to rely on the specific class.MockUtil no longer offers methods for mocking destinations or servers with the default destination name "ErpQueryEndpoint".
The destination name now is a mandatory parameter.ErpEdition (also removed in mocking of ErpSystem).BapiRequest instead.scp-cf-tomcat).
Use the TomEE or Spring archetypes instead when starting a new project.com.sap.cloud.sdk instead of com.sap.cloud.s4hana.s4hana in the group id is only used if the contained module is in some way specific for SAP S/4HANA.| Module name in 2.19.2 | Module name in 3.0.0 |
|---|---|
| com.sap.cloud.s4hana.archetypes:archetypes-parent | com.sap.cloud.sdk.archetypes:archetypes-parent |
| com.sap.cloud.s4hana.archetypes:scp-cf-spring | com.sap.cloud.sdk.archetypes:scp-cf-spring |
| com.sap.cloud.s4hana.archetypes:scp-cf-tomcat | |
| com.sap.cloud.s4hana.archetypes:scp-cf-tomee | com.sap.cloud.sdk.archetypes:scp-cf-tomee |
| com.sap.cloud.s4hana.archetypes:scp-neo-javaee7 | com.sap.cloud.sdk.archetypes:scp-neo-javaee7 |
| com.sap.cloud.s4hana.cloudplatform:auditlog | com.sap.cloud.sdk.cloudplatform:auditlog |
| com.sap.cloud.s4hana.cloudplatform:auditlog-scp-cf | com.sap.cloud.sdk.cloudplatform:auditlog-scp-cf |
| com.sap.cloud.s4hana.cloudplatform:auditlog-scp-neo | com.sap.cloud.sdk.cloudplatform:auditlog-scp-neo |
| com.sap.cloud.s4hana.cloudplatform:caching | com.sap.cloud.sdk.cloudplatform:caching |
| com.sap.cloud.s4hana.cloudplatform:cloudplatform-parent | com.sap.cloud.sdk.cloudplatform:cloudplatform-parent |
| com.sap.cloud.s4hana.cloudplatform:concurrency-scp-neo | com.sap.cloud.sdk.cloudplatform:concurrency-scp-neo |
| com.sap.cloud.s4hana.cloudplatform:connectivity | com.sap.cloud.sdk.cloudplatform:cloudplatform-connectivity |
| com.sap.cloud.sdk.cloudplatform:cloudplatform-connectivity-scp | |
| com.sap.cloud.s4hana.cloudplatform:connectivity-scp-cf | com.sap.cloud.sdk.cloudplatform:cloudplatform-connectivity-scp-cf |
| com.sap.cloud.s4hana.cloudplatform:connectivity-scp-neo | com.sap.cloud.sdk.cloudplatform:cloudplatform-connectivity-scp-neo |
| com.sap.cloud.s4hana.cloudplatform:core | com.sap.cloud.sdk.cloudplatform:cloudplatform-core |
| com.sap.cloud.s4hana.cloudplatform:core-scp-cf | com.sap.cloud.sdk.cloudplatform:cloudplatform-core-scp-cf |
| com.sap.cloud.s4hana.cloudplatform:core-scp-neo | com.sap.cloud.sdk.cloudplatform:cloudplatform-core-scp-neo |
| com.sap.cloud.s4hana.cloudplatform:metering | com.sap.cloud.sdk.cloudplatform:metering |
| com.sap.cloud.s4hana.cloudplatform:metering-scp-neo | com.sap.cloud.sdk.cloudplatform:metering-scp-neo |
| com.sap.cloud.sdk.cloudplatform:resilience | |
| com.sap.cloud.s4hana.cloudplatform:scp-cf | com.sap.cloud.sdk.cloudplatform:scp-cf |
| com.sap.cloud.s4hana.cloudplatform:scp-neo | com.sap.cloud.sdk.cloudplatform:scp-neo |
| com.sap.cloud.s4hana.cloudplatform:security | com.sap.cloud.sdk.cloudplatform:security |
| com.sap.cloud.s4hana.cloudplatform:security-scp-cf | com.sap.cloud.sdk.cloudplatform:security-scp-cf |
| com.sap.cloud.s4hana.cloudplatform:security-scp-neo | com.sap.cloud.sdk.cloudplatform:security-scp-neo |
| com.sap.cloud.sdk.cloudplatform:security-servlet | |
| com.sap.cloud.s4hana.cloudplatform:servlet | com.sap.cloud.sdk.cloudplatform:servlet |
| com.sap.cloud.s4hana.cloudplatform:tenant | com.sap.cloud.sdk.cloudplatform:tenant |
| com.sap.cloud.s4hana.cloudplatform:tenant-scp-cf | com.sap.cloud.sdk.cloudplatform:tenant-scp-cf |
| com.sap.cloud.s4hana.cloudplatform:tenant-scp-neo | com.sap.cloud.sdk.cloudplatform:tenant-scp-neo |
| com.sap.cloud.s4hana.datamodel:bapi-api | |
| com.sap.cloud.s4hana.datamodel:bapi-parent | |
| com.sap.cloud.s4hana.datamodel:messaging-api | com.sap.cloud.sdk.s4hana:s4hana-api-messaging |
| com.sap.cloud.sdk.datamodel:datamodel-parent | |
| com.sap.cloud.s4hana.datamodel:messaging-core | com.sap.cloud.sdk.datamodel:messaging-core |
| com.sap.cloud.s4hana.datamodel:messaging-jms | com.sap.cloud.sdk.datamodel:messaging-jms |
| com.sap.cloud.s4hana.datamodel:messaging-parent | com.sap.cloud.sdk.datamodel:messaging-parent |
| com.sap.cloud.s4hana.datamodel:odata-api | com.sap.cloud.sdk.s4hana:s4hana-api-odata |
| com.sap.cloud.s4hana.datamodel:odata-core | com.sap.cloud.sdk.datamodel:odata-core |
| com.sap.cloud.s4hana.datamodel:odata-generator | com.sap.cloud.sdk.datamodel:odata-generator |
| com.sap.cloud.s4hana.datamodel:odata-generator-cli | com.sap.cloud.sdk.datamodel:odata-generator-cli |
| com.sap.cloud.s4hana.datamodel:odata-generator-maven-plugin | com.sap.cloud.sdk.datamodel:odata-generator-maven-plugin |
| com.sap.cloud.s4hana.datamodel:odata-parent | com.sap.cloud.sdk.datamodel:odata-parent |
| com.sap.cloud.s4hana.frameworks:cxf | com.sap.cloud.sdk.frameworks:cxf |
| com.sap.cloud.s4hana.frameworks:eclipselink | com.sap.cloud.sdk.frameworks:eclipselink |
| com.sap.cloud.s4hana.frameworks:eclipselink-javaee | com.sap.cloud.sdk.frameworks:eclipselink-javaee |
| com.sap.cloud.s4hana.frameworks:frameworks-parent | com.sap.cloud.sdk.frameworks:frameworks-parent |
| com.sap.cloud.s4hana.frameworks:hystrix | |
| com.sap.cloud.s4hana.frameworks:hystrix-scp-neo | |
| com.sap.cloud.s4hana.frameworks:javaee | com.sap.cloud.sdk.frameworks:javaee |
| com.sap.cloud.s4hana.frameworks:jaxrs | com.sap.cloud.sdk.frameworks:jaxrs |
| com.sap.cloud.s4hana.frameworks:jaxrs-gson | com.sap.cloud.sdk.frameworks:jaxrs-gson |
| com.sap.cloud.s4hana.frameworks:liquibase | com.sap.cloud.sdk.frameworks:liquibase |
| com.sap.cloud.s4hana.frameworks:liquibase-javaee | com.sap.cloud.sdk.frameworks:liquibase-javaee |
| com.sap.cloud.sdk.frameworks:resilience4j | |
| com.sap.cloud.s4hana.frameworks:spring-boot-multitenancy-scp-cf | com.sap.cloud.sdk.frameworks:spring-boot-multitenancy-scp-cf |
| com.sap.cloud.s4hana.frameworks:spring-web | com.sap.cloud.sdk.frameworks:spring-web |
| com.sap.cloud.s4hana.frameworks:togglz | com.sap.cloud.sdk.frameworks:togglz |
| com.sap.cloud.s4hana.plugins:plugins-parent | com.sap.cloud.sdk.plugins:plugins-parent |
| com.sap.cloud.s4hana.plugins:s4sdk-maven-plugin | com.sap.cloud.sdk.plugins:scp-neo-maven-plugin |
| com.sap.cloud.s4hana.plugins:scp-neo-maven-plugin | com.sap.cloud.sdk.plugins:usage-analytics |
| com.sap.cloud.s4hana.plugins:usage-analytics | com.sap.cloud.sdk.plugins:usage-analytics-maven-plugin |
| com.sap.cloud.s4hana.quality:common | com.sap.cloud.sdk.quality:common |
| com.sap.cloud.s4hana.quality:httpclient-listener | com.sap.cloud.sdk.quality:httpclient-listener |
| com.sap.cloud.s4hana.quality:listeners-all | com.sap.cloud.sdk.quality:listeners-all |
| com.sap.cloud.s4hana.quality:odata-querylistener | com.sap.cloud.sdk.quality:odata-querylistener |
| com.sap.cloud.s4hana.quality:pmd-plugin | com.sap.cloud.sdk.quality:pmd-plugin |
| com.sap.cloud.s4hana.quality:pmd-rules | com.sap.cloud.sdk.quality:pmd-rules |
| com.sap.cloud.s4hana.quality:quality-parent | com.sap.cloud.sdk.quality:quality-parent |
| com.sap.cloud.s4hana.quality:rfc-querylistener | com.sap.cloud.sdk.quality:rfc-querylistener |
| com.sap.cloud.s4hana.services:blockchain | com.sap.cloud.sdk.services:blockchain |
| com.sap.cloud.s4hana.services:recast-ai | com.sap.cloud.sdk.services:recast-ai |
| com.sap.cloud.s4hana.services:scp-blockchain | com.sap.cloud.sdk.services:scp-blockchain |
| com.sap.cloud.s4hana.services:scp-machine-learning | com.sap.cloud.sdk.services:scp-machine-learning |
| com.sap.cloud.s4hana.services:services-parent | com.sap.cloud.sdk.services:services-parent |
| com.sap.cloud.s4hana:connectivity | com.sap.cloud.sdk.s4hana:s4hana-connectivity |
| com.sap.cloud.s4hana:core | com.sap.cloud.sdk.s4hana:s4hana-core |
| com.sap.cloud.s4hana:datamodel | |
| com.sap.cloud.s4hana:fluent-result | com.sap.cloud.sdk.datamodel:fluent-result |
| com.sap.cloud.s4hana:rfc | com.sap.cloud.sdk.s4hana:rfc |
| com.sap.cloud.s4hana:s4hana-all | com.sap.cloud.sdk.s4hana:s4hana-all |
| com.sap.cloud.s4hana:s4hana-parent | com.sap.cloud.sdk.s4hana:s4hana-parent |
| com.sap.cloud.sdk.s4hana:s4hana-api-parent | |
| com.sap.cloud.s4hana:sdk-bom | com.sap.cloud.sdk:sdk-bom |
| com.sap.cloud.s4hana:sdk-modules-bom | com.sap.cloud.sdk:sdk-modules-bom |
| com.sap.cloud.s4hana:sdk-parent | com.sap.cloud.sdk:sdk-parent |
| com.sap.cloud.s4hana:soap | com.sap.cloud.sdk.datamodel:soap |
| com.sap.cloud.s4hana:testutil | com.sap.cloud.sdk.testutil:testutil-core |
| com.sap.cloud.sdk.testutil:testutil-parent | |
| com.sap.cloud.s4hana:testutil-resources | com.sap.cloud.sdk.testutil:testutil-resources |
old qualified name -> new qualified name):
s4hana:s4hana-connectivity (was s4hana:connectivity)
com.sap.cloud.sdk.s4hana.connectivity.AbstractQuerySerializer -> com.sap.cloud.sdk.s4hana.connectivity.AbstractRequestSerializer
com.sap.cloud.sdk.s4hana.connectivity.QueryExecutor -> com.sap.cloud.sdk.s4hana.connectivity.RequestExecutor
com.sap.cloud.sdk.s4hana.connectivity.QueryResult -> com.sap.cloud.sdk.s4hana.connectivity.RequestResult
com.sap.cloud.sdk.s4hana.connectivity.QuerySerializer -> com.sap.cloud.sdk.s4hana.connectivity.RequestSerializer
com.sap.cloud.sdk.s4hana.connectivity.Query -> com.sap.cloud.sdk.s4hana.connectivity.Request
com.sap.cloud.sdk.s4hana.connectivity.QueryBody -> com.sap.cloud.sdk.s4hana.connectivity.RequestBody
com.sap.cloud.sdk.s4hana.connectivity.QueryExecutionMeasurements -> com.sap.cloud.sdk.s4hana.connectivity.RequestExecutionMeasurements
com.sap.cloud.sdk.s4hana.connectivity.SerializedQuery -> com.sap.cloud.sdk.s4hana.connectivity.SerializedRequest
com.sap.cloud.sdk.s4hana.connectivity.SerializedQueryResult -> com.sap.cloud.sdk.s4hana.connectivity.SerializedRequestResult
com.sap.cloud.sdk.s4hana.connectivity.exception.QueryExecutionException -> com.sap.cloud.sdk.s4hana.connectivity.exception.RequestExecutionException
com.sap.cloud.sdk.s4hana.connectivity.exception.QuerySerializationException -> com.sap.cloud.sdk.s4hana.connectivity.exception.RequestSerializationException
datamodel:soap (was s4hana:soap)
com.sap.cloud.sdk.s4hana.connectivity.soap.SoapQuery -> com.sap.cloud.sdk.s4hana.connectivity.soap.SoapRequest
s4hana:rfc
com.sap.cloud.sdk.s4hana.connectivity.rfc.BapiQuery-> com.sap.cloud.sdk.s4hana.connectivity.rfc.BapiRequest
com.sap.cloud.sdk.s4hana.connectivity.rfc.RemoteFunctionQueryErrorHandler-> com.sap.cloud.sdk.s4hana.connectivity.rfc.RemoteFunctionRequestErrorHandler
com.sap.cloud.sdk.s4hana.connectivity.rfc.RemoteFunctionQueryExecutor -> com.sap.cloud.sdk.s4hana.connectivity.rfc.RemoteFunctionRequestExecutor
com.sap.cloud.sdk.s4hana.connectivity.rfc.AbstractRemoteFunctionQuery -> com.sap.cloud.sdk.s4hana.connectivity.rfc.AbstractRemoteFunctionRequest
com.sap.cloud.sdk.s4hana.connectivity.rfc.AbstractRemoteFunctionQueryResult -> com.sap.cloud.sdk.s4hana.connectivity.rfc.AbstractRemoteFunctionRequestResult
com.sap.cloud.sdk.s4hana.connectivity.rfc.BapiQueryResult -> com.sap.cloud.sdk.s4hana.connectivity.rfc.BapiRequestResult
com.sap.cloud.sdk.s4hana.connectivity.rfc.RemoteFunctionQueryListener -> com.sap.cloud.sdk.s4hana.connectivity.rfc.RemoteFunctionRequestListener
com.sap.cloud.sdk.s4hana.connectivity.rfc.RfcQuery -> com.sap.cloud.sdk.s4hana.connectivity.rfc.RfmRequest
com.sap.cloud.sdk.s4hana.connectivity.rfc.RfcQueryResult -> com.sap.cloud.sdk.s4hana.connectivity.rfc.RfmRequestResult
com.sap.cloud.sdk.s4hana.connectivity.rfc.RfcTransactionFactory -> com.sap.cloud.sdk.s4hana.connectivity.rfc.RfmTransactionFactory
com.sap.cloud.sdk.s4hana.connectivity.rfc.SoapRemoteFunctionQuerySerializer -> com.sap.cloud.sdk.s4hana.connectivity.rfc.SoapRemoteFunctionRequestSerializer
quality
com.sap.cloud.s4hana.quality.FileWritingQueryListenerUtil -> com.sap.cloud.s4hana.quality.FileWritingRequestListenerUtil
com.sap.cloud.s4hana.quality.FileWritingRemoteFunctionQueryListener -> com.sap.cloud.s4hana.quality.FileWritingRemoteFunctionRequestListener
cloudplatform:servlet
com.sap.cloud.sdk.cloudplatform.servlet.response.QueryExecutionErrorResponse -> com.sap.cloud.sdk.cloudplatform.servlet.response.RequestExecutionErrorResponse
| Library | Version used in 2.19.2 | Version used in 3.0.0 |
|---|---|---|
| bcpkix-jdk15on | 1.6 | 1.62 |
| bcprov-jdk15on | 1.6 | 1.62 |
| guava | 27.0.1-jre | 28.0-jre |
| plexus-utils | 3.1.0 | 3.2.0 |
| lombok | 1.18.2 | 1.18.8 |
| javax.ejb:javax.ejb-api | 3.2 | 3.2.2 |
| javax.servlet:javax.servlet-api | 3.1.0 | 4.0.1 |
| javax.ws.rs:javax.ws.rs-api | 2.0 | 2.1.1 |
| org.eclipse.jetty:apache-jsp | 9.4.17.v20190418 | 9.4.17.v20190418 |
| org.jboss.arquillian.config:arquillian-config-api | 1.4.0.Final | 1.4.1.Final |
| byte-buddy | (not used) | 1.9.13 |
| commons-codec | 1.11 | 1.12 |
| commons-lang3 | 3.8.1 | 3.9 |
| commons-text | 1.4 | 1.7 |
| httpclient | 4.5.6 | 4.5.9 |
| httpcore | 4.4.10 | 4.4.11 |
| assertj-core | 3.12.0 | 3.12.2 |
| hibernate-core | 5.0.12.Final | 5.4.3.Final |
| eclipselink | 2.7.3-RC1 | 2.7.4 |
| java-jwt | 3.4.0 | 3.8.1 |
| javax.persistence | 2.1.0 | 2.2.1 |
| joda-time | 2.10 | 2.10.2 |
| jooq | 3.6.2 | 3.11.11 |
| jsoup | 1.11.3 | 1.12.1 |
| liquibase-core | 3.6.2 | 3.6.3 |
| spring-security-oauth | 2.3.4.RELEASE | 2.3.6.RELEASE |
| tomcat-annotations-api | 8.5.40 | 8.5.42 |
| tomcat-jdbc | 8.5.40 | 8.5.42 |
| io.rest-assured:json-path | 3.2.0 | 4.0.0 |
| javax:javaee-api | 7.0 | 8.0.1 |
| javax.validation:validation-api | 1.1.0.Final | 2.0.1.Final |
| org.assertj:assertj-guava | 3.2.0 | 3.2.1 |
| org.hibernate.validator:hibernate-validator | 6.0.13.Final | 6.0.17.Final |
| lombok-maven-plugin | 1.18.2.0 | 1.18.6.0 |
| javax.cache:cache-api | 1.0.0 | 1.1.1 |
| vavr | 0.9.2 | 0.9.3 |
| wiremock | 2.19.0 | 2.20.0 |
| io.github.resilience4j:resilience4j-bulkhead | (not used) | 0.16.0 |
| io.github.resilience4j:resilience4j-cache | (not used) | 0.16.0 |
| io.github.resilience4j:resilience4j-timelimiter | (not used) | 0.16.0 |
org.checkerframework:checker-qual has been excluded entirely to avoid license issues.
That is, it is neither a direct dependency of the SDK anymore, nor is it a transitive dependency of either Caffeine or Guava (when brought in by the SDK).
DefaultHttpDestination.builder or ScpCfHttpDestination.builder.DestinationOptions.ScpCfDestinationLoader or ScpNeoDestinationLoader will consider different options that give fine-granular control over the behavior when loading the destination (for example, if provider or subscriber destinations shall take precedence).builder method.augmentBuilder method to set configuration parameters that are specific to a loader (platform or environment) using an appropriate class implementing DestinationOptionsAugmenter.Callable or Executable) by overriding (that is, "on-behalf of") the Tenant, Principal, or AuthToken of the context in TenantAccessor, PrincipalAccessor, and AuthTokenAccessor.TenantAccessor.executeWithTenant, the given callable/executable will be executed in a context where the given tenant is set as the current tenant.TenantAccessor.executeWithFallbackTenant) or globally (for example, with TenantAccessor.setFallbackTenant). Whenever, for example, a tenant is requested but not available, the SDK will retrieve a fallback tenant from the given supplier.RequestAccessor and allow overriding the request and providing a fallback request when executing code.XsuaaService public for communicating with a given XSUAA service on SAP Cloud Platform, Cloud Foundry.com.sap.cloud.sdk.cloudplatform.resilience. Provide a default implementation of resilience using resilience4j as underlying library.ResilienceDecorator as the entry point for wrapping any code (callabe or supplier) with resilient behavior.ResilienceConfigurationThreadContexts.DefaultMessageDelegator to improve error inspection in the messaging core module.February 13, 2020 - Maven Central - Javadoc - Release blog
WorkItems in the service Commercial Project - Read is no longer allowed as of SAP S/4HANA Cloud release 2002. The method updateWorkItem() was removed from CommercialProjectService.3.2.11 to 3.2.12 to overcome the security vulnerability CVE-2019-17573.9.4.25.v20191220 to 9.4.26.v20200117 to overcome the security vulnerability CVE-2018-12536.4.3.26.RELEASE to overcome the security vulnerability CVE-2020-5397.January 30, 2020 - Maven Central - Javadoc - Release blog
ODataRequestBuilder of OData V2 Connectivity API by the additional fields sap-client and sap-language if corresponding destination properties are defined. You might need to remove the calls to withHeader() to have these headers set automatically.5.1.2 to 5.1.13 fixing the vulnerability CVE-2020-53985.1.2 to 5.1.7January 16, 2020 - Maven Central - Javadoc - Release blog
7.0.5 to 7.0.64.4.10 to 4.4.12, client from version 4.5.6 to 4.5.109.4.17.v20190418 to 9.4.25.v20191220PATCH semantics where null values were being filtered out before the update. Explicitly set null values are being retained now.December 19, 2019 - Maven Central - Javadoc - Release blog
Edm.Time, Edm.DateTime or Edm.DateTimeOffset.December 5, 2019 - Maven Central - Javadoc - Release blog
/) were incorrectly escaped in OData requests made when dynamically fetching a navigation property of an entity whose key contains such characters.November 21, 2019 - Maven Central - Javadoc - Release blog
October 24, 2019 - Maven Central - Javadoc - Release blog
October, 10, 2019 - Maven Central - Javadoc - Release blog
Bearer" was spelled in title case. Now, corresponding methods do a case insensitive check for "bearer". That means, "bearer" and "Bearer" are now equally supported as correct authorization header.2.9.9/2.9.9.2 to 2.9.10.commons-beanutils:commons-beanutils with version 1.9.4 (from 1.9.3 ).September 26, 2019 - Maven Central - Javadoc - Release blog
user_name claim of the current JWT in ScpCfPrincipalFacade when the JWT has the user_token grant type.September 12, 2019 - Maven Central - Javadoc - Release blog
listeners-all dependencies from projects generated via archetypes since the SAP Cloud SDK Pipeline will inject this dependency during a pipeline run.August 29, 2019 - Maven Central - Javadoc - Release blog
August 15, 2019 - Maven Central - Javadoc - Release blog
OutboundDeliveryService has been removed from the SAP API Business Hub and, as a consequence, from the SDK. Use OutboundDeliveryV2Service instead.August 1, 2019 - Maven Central - Javadoc - Release blog
com.sap.cloud.servicesdk.*) from version 1.31.1 to 1.32.0. This fixes an issue where deep insert did not work beyond the first level.July 18, 2019 - Maven Central - Javadoc - Release blog
July 4, 2019 - Maven Central - Javadoc - Release blog
com.sap.cloud.servicesdk.*) from version 1.29.0 to version 1.31.1. This contains the following fixes:null values.scp-cf-tomcat archetype to version 8.5.42.TextMessage from JMS in JmsMessagingVdmConverter to extract the message payload also from messages of such type (in addition to ByteMessage).June 20, 2019 - Maven Central - Javadoc - Release blog
execute for an update request via PATCH if the request will be sent with an empty body when no fields of the entity have been registered as changed.getVcapApplication and getVcapServices in ScpCfCloudPlatform by only parsing JSON from the environment variables once instead of parsing it on each invocation.June 6, 2019 - Maven Central - Javadoc - Release blog
com.sap.cloud.sdk.s4hana.datamodel.messaging.api.message).listStreams when the result included non-subscribed streams.May 23, 2019 - Maven Central - Javadoc - Release blog
ChangeMasterService has been renamed to ChangeMasterV2Service to reflect that this service refers to version 2 of that API. The corresponding namespace package has been moved as well, from ...namespaces.changemaster to ...namespaces.changemasterv2.KanbanControlCycleService has similarly been renamed to KanbanControlCycleV2Service and InboundDeliveryService to InboundDeliveryV2Service.com.sap.cloud.sdk.s4hana.datamodel.odata.services),
new operations in previously existing services, and new entity types. The SDK supports all OData
services listed in the SAP API Business Hub for SAP S/4HANA Cloud.
May 9, 2019 - Maven Central - Javadoc - Release blog
ScpXfDestinationFacade
to read destinations from the VCAP_SERVICES environment variable in Cloud
Foundry (as used by Extension Factory).FallbackDestinationFacade
to use destination service and extension factory in parallel. The
FallbackDestinationFacade allows to specify as constructor parameters one
primary DestinationFacade and a secondary facade as fallback that is used if no
destination of a given name is found using the primary facade.DestinationAccessor.setDestinationFacade.
PUT semantics (replace).
PATCH remains the default.PUT and send the full entity that is meant to replace the
current state of the entity, call
replacingEntity
on any fluent helper for update requests.PATCH and only send changed fields (which is also the
default if nothing is specified), call
modifyingEntity.
scp-cf-tomcat archetype to version 8.5.40 (from
8.5.23) due to a known vulnerability (CVE-2019-0232).PrincipalAccessor
also in case of a JWT with scope authorization_code.MultichainTransaction.
April 25, 2019 - Maven Central - Javadoc - Release blog
S4HanaMessageParser to
CloudEventsMessageParser
and S4HanaMessageMetadata to
CloudEventsMessageMetadata
in order to better reflect their generic purpose. MessageTopic class. The
fromMessage
method of
MessagingVdmConverter
only needs the plain string payload.ReservationDocumentService
no longer allows to create and delete
ReservationDocumentHeader
to reflect what is supported according to the description on SAP API Business Hub.update, create, and delete operations
in OData.batch
method available on each service representation to begin constructing a batch request.BusinessPartnerServiceBatch)
allows to begin
a new change set, add
operations to this change set, and end
the change set.BatchResponse
gives access to the results
of individual change sets accessible by their index, returned as a Try
that wraps the actual result or any exception.getCreatedEntities.
count
method available on all fluent helpers for queries.top and skip have no effect on the result.withCustomQueryParameter
(also
available for by-key requests).OAuth2UserTokenExchange.
OAuth2SAMLBearerAssertion, the user exchange token flow is
conducted with the XSUAA which issues a JWT encompassing the user principal.eventType property found in message payloads that
follow the cloudevents specification, like SAP S/4HANA Cloud.
failOnWarning (introduced both in the CLI and in the Maven plugin) for
this purpose.MultichainCommand
in
MultichainService
class which would lead to the code being executed within the same thread, not the intended thread
pools of Hystrix.April 11, 2019 - Maven Central - Javadoc - Release blog
MessageListeners
no longer have topic or message factory methods. Instead, there is a
getMessageType
method that returns the class of message the listener recognizes. The
MessageDelegator
now operates on Message VDM messages instead of string topics and payload, so that the
conversion is outsourced to the new converters.onBehalfOfTenant(@Nonnull String tenant, @Nullable String issuerUrl, @Nonnull String... audiences)
of
JwtBasedRequestContextExecutor
has been deprecated in favor of the more specific methods mentioned below.MessageFactoryMapper
interface for mapping of message types to message
factory class names.MessageFactoryMapper called
VdmMessages
for currently supported message types.MessagingVdmConverter
with the desired MessageFactoryMappers and call the method
fromMessage.
JmsMessagingVdmConverter,
which will use VdmMessages for mapping, and then call the
fromMessage
method.JmsMessageDelegator
that accepts a JMS message converter instance.PrincipalAccessor.
The returned
Principal
object includes the identifier
of the principal, which is either the user_name or client_id, depending on
the current grant_type, as well as authorization
information. In the Neo environment of SAP Cloud Platform, the principal is equivalent to
the user.m2eclipse lifecycle mappings for the
scp-neo-maven-plugin, odata-generator-maven-plugin, and
pmd-plugin to integrate the plugins with Maven in Eclipse and remove warnings like
"plugin execution not covered by lifecycle configuration".onBehalfOfTenant( @Nonnull String tenantId )
that uses default values for issuerUrl and audiences.onBehalfOfTenant(@Nonnull String tenantId, @Nonnull String issuerUrl, @Nonnull Collection<String> audiences )
for full customization of these values. This method replaces the previously existing method.
audiences will be
initialized with the own application name as taken from the XSUAA service binding context.
March 28, 2019 - Maven Central - Javadoc - Release blog
m2eclipse lifecycle mappings for the
s4sdk-maven-plugin to integrate the plugin with Maven in Eclipse and remove warnings
like "plugin execution not covered by lifecycle configuration".GsonMessageBodyProvider
where
readFrom
did not properly sanitize the JSON input to be converted.March 14, 2019 - Maven Central - Javadoc - Release blog
scp-blockchain have been deprecated
in favor of the improved classes in the new experimental module
com.sap.cloud.s4hana.services:blockchain.
HttpCachingHeaderWrapper has been deprecated in favor of using
HttpCachingHeaderFilter.
cachingMetadata
on fluent helpers. Revert to the default by using
withoutCachingMetadata.
blockchain
for interacting with the SAP Cloud Platform Blockchain service.MultichainService
offers fluent and type-safe access to MultiChain commands.onBehalfOfTenant
of
JwtBasedRequestContextExecutor
to execute code in a context for the tenant with the given tenandId.issuerUrl
and audience. Depending on the code executed on behalf, certain token
audiences may be required. If no URL is provided, a default will be created to match the
XSUAA service URL expected for the subscribed tenant.scp-neo-javaee7 to 1.44.12.WireMockConfiguration to
MockUtil.mockServer
and
MockUtil.mockErpServer.
This enables the customization of mock servers upon initialization, e.g. address mapping, port
mapping, thread settings, SSL- and proxy configuration.HttpCachingHeaderFilter
did not add HTTP response headers in certain situations. For example, when the consuming application
is using JAX-RS, the filter operation was not triggered in the past. With the new implementation,
the cache headers will be set in these cases as well. It is now recommended to place the filter at
the end of the filter chain, instead of the beginning.February 28, 2019 - Maven Central - Javadoc - Release blog
BapiQuery
and
RfcQuery
now do a synchronous commit by default, instead of asynchronously committing, to adhere to
the stated API contract. If your code relies on an asynchronous commit or does not need the
added safety of waiting for the commit to succeed, see below how
to restore the previous behavior.FilterExpressionHelper
for the different approaches to create a filter query option and pass
it to the OData VDM. This should not affect existing code, but you may need to
recompile your code.BapiQuery
and
RfcQuery
by specifying
an own
error handler.
BapiQueryResult
or
RfcQueryResult
if a
RemoteFunctionException
shall be thrown.BapiQuery and RfcQuery offer convenience methods
as part of their fluent API to always
ignore errors or to always
propagate them as exceptions.FilterExpression
from the SAP
Cloud Application Programming Model as an
UncheckedFilterExpression.
FilterExpressionConverter
provided by the Cloud Application Programming Model to convert an expression from a query
request to a FilterExpression.maven-surefire-plugin used in archetypes from 3.0.0-M2 to 3.0.0-M3.BapiQuery
and
RfcQuery
had been committed asynchronously despite the API promising a synchronous commit.CommitStrategy,
which also allows not committing the call as a third option.BapiQuery
and
RfcQuery
did not throw a
RemoteFunctionCommitFailedException
in case the transaction could not be committed successfully. The change only applies to JCo-based
RFC transactions; SOAP-based operations are not affected.February 14, 2019 - Maven Central - Javadoc - Release blog
TenantAccessor.tryGetCurrentTenant
and
UserAccessor.tryGetCurrentUser
now correctly propagate the TenantNotAvailableException in case the tenant is
not available instead of returning Success(null). If you relied on the
previous, erroneous behavior, you may have to adapt your code.TenantAccessor.getCurrentTenant()
on Cloud Foundry has been adapted so that it falls back to the provider tenant if no tenant
is otherwise specified in the request context.com.sap.cloud.sdk.s4hana.datamodel.odata.services),
new operations in previously existing services, and new entity types. The SDK supports all OData
services listed in the SAP API Business Hub for
SAP S/4HANA Cloud.
messaging-api
contains Java
classes representing each of the business event types that an SAP S/4HANA Cloud
system (release 1902) may emit, as well as corresponding listener
interfaces that you can implement to handle messages in a type-safe manner.messaging-jms
provides a message
delegator for dispatching messages received via JMS to registered
listeners.getXsuaaServiceToken()
to the AuthTokenAccessor that allows the caller to receive a JWT from the XSUAA service
bound to the application.TenantAccessor.getCurrentTenant()
to fallback to the provider tenant on Cloud Foundry in case no tenant is available in the current
request context.
AuthTokenAccessor.getXsuaaServiceToken() in case
AuthTokenAccessor.getCurrentToken()
does not return a token.withXsuaaServiceJwt()
to the JwtBasedRequestContextExecutor that creates a request context using a JWT
internally retrieved from the aforementioned AuthTokenAccessor.getXsuaaServiceToken
method so that manually passing a JWT is not necessary.TenantAccessor.tryGetCurrentTenant
and
UserAccessor.tryGetCurrentUser
returned Success(null) in case the tenant is not available instead of propagating the
TenantNotAvailableException.
January 31, 2019 - Maven Central - Javadoc - Release blog
BillOfMaterialsV2Service,
and the package for entities and helpers moved to
billofmaterialsv2,
instead of BillOfMaterialsService and billofmaterials. Under the
previous names, the VDM now again references the older version 1 of the same API.StringUserAttribute
instead of SimpleUserAttribute<String>. On Cloud Foundry, user attributes
are now returned as an instance of
StringCollectionUserAttribute
instead of CollectionUserAttribute<String>. You may need to adapt the
expectations that your code makes regarding the return type.UnsupportedOperationException.BillOfMaterialsV2Service.
BillOfMaterialsService.
StringUserAttribute
instead of SimpleUserAttribute<String> on SAP Cloud Platform Neo, and as
StringCollectionUserAttribute
instead of CollectionUserAttribute<String> on Cloud Foundry to allow more
convenient consumption.scp-cf-tomee, scp-cf-tomcat, scp-neo-javaee7 archetypes to
further reduce memory consumption.ForEachSystemRule
test utility to support the notion of fallback
systems. These are systems for which the tests are executed (in-order) after the test failed
with the first configured system. A test is considered successful if at least one of the specified
systems succeeds.@Nonnull annotations to public methods where
applicable.scp-cf-tomee archetype where TomEE would not
start because of a conflict with the default shutdown port 8005 on Windows. Now, shutdown port 8006
is explicitly specified in application/pom.xml.scp-cf-tomcat archetype where integration
tests failed when run from an IDE because of a missing port configuration for arquillian. Now, a
default port 9090 is defined in arquillian.xml which takes effect unless a system
property arquillian.httpPort is passed to the test runner. Note: in IntelliJ, you still
need to disable passing systemPropertyVariables to JUnit in
File | Settings | Build, Execution, Deployment | Build Tools | Maven | Running Tests or
pass -Darquillian.httpPort=9090 manually.January 17, 2019 - Maven Central - Javadoc - Release blog
--include-entity-sets and --include-function-imports which take a
comma-separated list of entity set or function import names.includeEntitySets and
includeFunctionImports which take a set of <param> tags,
each containing the name of an entity set or function import, respectively.RequestContextServletFilters
to enable stepwise initialisation of objects. Set the property useParentContext to
true to enable this.request parameter to the
invoke
method. This gives callers more flexibility on what URL will be called.javax.validation:validation-api to 2.0.1.Final in
scp-cf-spring archetype.s4sdk-maven-plugin in parallel
builds.December 20, 2018 - Maven Central - Javadoc - Release blog
AuditLogger
has been adapted to properly reflect its runtime behavior on Cloud Foundry:@Nullable Iterable<AccessedAttribute> as parameter have been
deprecated in favor of methods that take
@Nonnull AccessedAttribute, @Nullable AccessedAttribute....skip flag of the usage-analytics goal in the
s4sdk-maven-plugin
has been replaced by a flag with the
name skipUsageAnalytics. While the skip parameter is still being
evaluated, it is now deprecated
and may change its behavior in the future. Therefore, please use
skipUsageAnalytics instead after updating the
plugin.getType in
ValidationMessages
has been renamed to
getType_2
in order to prevent name clashes in the created entities with already existing methods.attachToService
in all entity classes to allow setting the service path and ErpConfigContext after
creating an entity manually.ErpConfigContext. Please use the attachToService method
instead for setting the ErpConfigContext.beans.xml file to projects created by the scp-cf-tomee,
scp-cf-tomcat, and scp-neo-javaee7 archetypes that excludes VDM namespaces
from CDI scanning.beans.xml file, it is
recommended to include the following scan exclusions to achieve the same in already
generated projects:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="annotated">
<scan>
<!-- do not scan namespaces since CDI is only required for service classes -->
<exclude name="com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.**"/>
</scan>
</beans>
scp-cf-tomee archetype to use TomEE 7 (Web Profile).scp-cf-spring archetype how to setup security and manage
spring-security and spring-security-oauth2 in the SDK's bill of
material (BOM).argLine flag when running tests.surefire.forkDir which is set by the surefire plugin and
referenced in the src/test/resources/arquillian.xml configuration file.tryGetCurrentUser
in
UserAccessor
and
UserFacade
which returns a
Try
for the current user.null) or any possibly thrown
exception, also allowing to write idiomatic code without try-catch-blocks.com.fasterxml.jackson.core:jackson-annotations from 2.9.7 to
2.9.0. According to the Jackson documentation there are no code changes in these minor
releases.AccessRequester
objects always tried to access the HTTP servlet request instead of taking the user from the
UserAccessor,
which is more stable and supports different usage scenarios.December 7, 2018 - Maven Central - Javadoc - Release blog
surefire plugin used in archetypes to 3.0.0-M1.ignoreVersionIdentifier
where no If-Match: * header was sent if no version identifier was set on the entity.
Now, If-Match: * will always be sent when activating
ignoreVersionIdentifier on update
and delete
requests to force an overwrite.scp-cf-spring
archetype that led to failures in generated projects when running tests with Java 11.November 22, 2018 - Maven Central - Javadoc - Release blog
PurOrdAccountAssignment; create, delete, and update for
PurOrdPricingElement, create and delete for
PurchaseOrderScheduleLine.ClfnClassDescForKeyDate has been removed from
the Class
Data for Classification service, as it is no longer part of the API on the SAP API Business
Hub.billofmaterials
package, the entity type BillOfMaterial has been renamed to
MaterialBOM
and CsapSBomExplOut to
DBomheaderforexplosionOut.
This also affects all related helper classes....Selectable interfaces have been moved into a corresponding
subpackage named selectable. For example, the interface
BusinessPartnerSelectable
can now be found in package
com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.businesspartner.selectable
...Field classes have similarly been moved into a subpackage named
field....Link classes have similarly been moved into a subpackage named
link.--delete-output-dir (CLI) or the
<deleteOutputDirectory>true</deleteOutputDirectory> (Maven
Plugin) options.com.sap.cloud.sdk.s4hana.datamodel.odata.services),
new operations in previously existing services, and new entity types.
The SDK supports all OData services listed in the SAP API Business Hub for
SAP S/4HANA Cloud.
com.sap.cloud.s4hana.services:recast-ai.
com.sap.cloud.s4hana.plugins:s4sdk-maven-plugin
for collecting usage data and diagnosis reports and add it to all archetypes.CustomerOneToOneLink)
provides a filter method.LocalScopePrefixProvider
interface and supplying an instance to the
ScpCfUserFacace.
DefaultLocalScopePrefixProvider.
HttpClientAccessor
by introducing methods
setHttpClientFactory
and
getHttpClientFactory
that correspond to the
HttpClientFactory
interface and deprecating methods setHttpClientProvider and
getHttpClientProvider.getAll* methods of the OData VDM API was immutable.November 8, 2018 - Maven Central - Javadoc - Release blog
RequestContextExecutor
within another request context. By default this is disabled. You must enable this functionality by
using the
withParentRequestContext()
method.spring-framework-bom from 5.1.0.RELEASE to
5.1.1.RELEASEspring-boot (used in archetype scp-cf-spring) from
2.0.5.RELEASE to 2.0.6.RELEASE.AccessedAttribute
to reflect that the
operation
will not be sent to the Audit Log when running on Cloud Foundry.orderBy
would result in the query to only contain the ordering expression of the last method call instead of
chaining the ordering according to the order in which the method is called.logDataWrite()
and
logDataWriteAttempt()
logged wrong values for
oldValue
and
newValue
October 25, 2018 - Maven Central - Javadoc - Release blog
TokenRequestFailedException
and
TokenRequestDeniedException
have been moved from the module connectivity-scp-cf to
security-scp-cf. If you catch these exceptions anywhere, you will need to
adjust your imports to
com.sap.cloud.sdk.cloudplatform.security.exception.<RespectiveException>.
integration-tests/pom.xml file. Add the following to avoid dependency
conflicts.
<dependency>
<groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>com.vaadin.external.google</groupId>
<artifactId>android-json</artifactId>
</exclusion>
</exclusions>
</dependency>
LiquibaseSlf4jLogger, because this version of liquibase uses logback instead of
a custom logger. If you use org.liquibase:liquibase-core, you may have to
exclude logback if you use another logger implementation.JwtBasedRequestContextExecutor
to improve support for asynchronous scenarios such as messaging.
JwtBasedRequestContextExecutor.withJwt(jwt, refreshToken).execute(() -> {})
to allow the SDK to automatically refresh the JWT in case it has expired.AuthTokenAcccessor
(see below).uaa.user.AuthTokenAccessor.getRefreshToken()
for retrieving a refresh token.ScpCfCloudPlatform.getXsuaaServiceCredentialsList(),
ScpCfCloudPlatform.getConnectivityServiceCredentialsList(),
ScpCfCloudPlatform.getDestinationServiceCredentialsList()
getXsuaaServiceCredentials())
will still throw exceptions on multiple bindings.compile instead of provided for spring-web
in
com.sap.cloud.s4hana.frameworks:spring-web.
org.skyscreamer:jsonassert in the
scp-cf-spring
archetype along with an exclusion to com.vaadin.external.google:android-json to
avoid runtime conflicts with org.json:json. Details on this issue can be found
here.tryGetCurrentTenant
in
TenantAccessor
and
TenantFacade
which returns a
Try
for the current tenant. This object contains the current tenant (possibly null) or any possibly
thrown exception, also allowing to write idiomatic code without try-catch-blocks. For more details
on this monadic container type, refer to the Vavr user
guide.SoapQuery
did not properly respect the proxy configuration.October 11, 2018 - Maven Central - Javadoc - Release blog
Authorization from interface to class in order to avoid
IncompatibleClassChangeErrors.generalledgerAccount of the Java Virtual Data Model (VDM) has been
renamed to
generalledgeraccount
to be all lower case./$value path
on an entity.
AttachmentContent
which expose media streams have a new method called
fetchAsStream().
java.io.InputStream that represents the media content.com.sap.cloud.s4hana.services:scp-machine-learning and
com.sap.cloud.s4hana.services:scp-blockchain.Authorization
into a Java class.
Authorization refers to a role, while on Cloud Foundry, it refers to
a scope.User::hasAuthorization
now performs the platform-specific check based on the passed instance of
Authorization.TenantContext in
ScpNeoTenant
when mocking a tenant with
MockUtil
on Neo could cause a NullPointerException when running tests that executed a Hystrix
command within a
RequestContextExecutor.
surefire.forkCount was not being applied correctly when running
tests in projects created from the archetypes.MeteringStats
where calling its methods in a RequestContextExecutor caused an exception to be thrown
about duplicate request contexts.TokenRequestDeniedException
and
TokenRequestFailedException
public, as they are exposed as part of the API, so that they can be caught.September 27, 2018 - Maven Central - Javadoc - Release blog
ScpCfService
(beta) that grants easy access to those services.
ScpCfServiceDesignator
(beta) to flexibly identify Cloud Foundry services with a convenient builder
pattern.ScpCfService that take such a designator
instead of service type and plan.key.serviceNameMappings.properties file so that valid Java identifiers will get
created from them.ODataVdmErrorResultHandler
where the httpStatusCode of the exception was not set properly.September 13, 2018 - Maven Central - Javadoc - Release blog
SoapQuery
class for convenient consumption of SOAP APIs exposed from SAP S/4HANA.asChildOf
of corresponding fluent
helpers.DestinationAccessor
class by the static methods
getRetrievalStrategy
and
setRetrievalStrategy.
DestinationRetrievalStrategy.
DestinationRetrievalStrategy.ALWAYS_PROVIDEREntity.
If-Match header.buildpacks in
manifest.yml which replaces the deprecated attribute buildpack. Visit the
official
documentation for more details.proxy misses the URI scheme. Formerly, an exception was thrown at runtime. Now, an info
message is logged.timeout attribute in
manifest.yml and increase the deployment timeout to 5 minutes in order to avoid issues
with larger deployments.August 16, 2018 - Maven Central - Javadoc - Release blog
ReleaseVersionBOM has been renamed to
BillOfMaterialReleaseVersionBOM, the name of the VDM
method as well as the fluent
helper have changed accordingly.ReferenceProcedure has been replaced by
ReferenceTransaction
withHttpHeader in
FluentHelperBasic.
If you are still using this method, replace its usage with
withCustomHttpHeader(key, value).onRequestAndImplicitRequests().
ExpectedFailureCase
in the testutil module has been deprecated. Please use a testing framework like
AssertJ instead. For example,
AssertJ offers comparable functionality with
Assertions.assertThatThrownBy.
com.sap.cloud.sdk.s4hana.datamodel.odata.services),
new operations in previously existing services, and new entity types.
The SDK supports all OData services listed in the SAP API Business Hub for
SAP S/4HANA Cloud.
asResilientCommand
method of fluent helper. To execute an OData request in a resilient manner, instead of
calling service.getAllBusinessPartner().execute(), call
service.getAllBusinessPartner().asResilientCommand().execute().ODataRequestCommand,
a sensible-default implementation of
ErpCommand
for OData requestscom.sap.cloud.servicesdk.prov:api,
com.sap.cloud.servicesdk.prov:odata2.web,
com.sap.cloud.servicesdk.prov:odata2.xsa,
com.sap.cloud.servicesdk.prov:odatav2-hybrid, and
com.sap.cloud.servicesdk.prov:odatav2-prov.null handling and type conversion)
occur during the parsing of OData payloads in the VDM. Previously, checked exceptions would be
thrown. In cases where the errors cannot be recovered from, an
ODataPayloadParsingFailedException
will be thrown, which is a RuntimeException.DataModelGenerator
class, use the methods
linkToApiBusinessHub(boolean)
or
linkToApiBusinessHub().
linkToApiBusinessHub.--generate-links-to-api-business-hub.getHeaderParameters
in the class
Query
and introduce a new method with name
getCustomHttpHeaders
to better reflect the purpose of this method. The deprecated method will be removed in one of the
next releases.scp-cf-spring archetype to 2.0.4.RELEASE..gitignore files not being correctly generated by archetypes. The ignore file
includes sensible defaults, including ignoring credential files to avoid accidentally committing
them to Git.August 2, 2018 - Maven Central - Javadoc - Release blog
getEndpointUrl
on
VdmEntity
classes has been deprecated in favor of the more accurate term service path. Use
getServicePathForFetch
instead in subclasses.JwtBasedRequestContextExecutor.
The new class allows specifying a JWT and execute code as if the JWT has been provided as part of a
HttpServletRequest. This can be useful in asynchronous scenarios.EntityField
subclass to represent the custom field and supply
a type converter. Getters
and setters
using this EntityField representation will automatically use the converter.
Edm.DateTime can be handled as
LocalDateTime instances instead of Calendar, which would otherwise
be the default type representation of such custom fields, by using the
LocalDateTimeCalendarConverter.
Similar converters exist out-of-the-box for LocalTime and
ZonedDateTime.EntityField instance, not when using a string
identifier or when getting
all custom fields.field(String, TypeConverter<T, DomainT>) (example)
of the corresponding VDM entity class.withServicePath(String) (example)
to specify a custom service path that will override the default service path. The returned
new service instance will use the provided service path for all OData requests. The method
leaves the original service instance unchanged.DEFAULT_SERVICE_PATH (example)
with the value of the default service path from SAP S/4HANA Cloud that is used if no custom
service path has been specified.withCustomHttpHeader
method of the base
Query
class provides a fluent API for adding single string-based key-value pairs, and the method
withSameCustomHttpHeadersAs
copies header parameters from another query.AuditedDataSubject
and
AuditedDataObject.
July 5, 2018 - Maven Central - Release blog
<excludes>), for the command line interface (--excludes), and for
the Java class
(withExcludeFilePattern).
It accepts an ant-style pattern such as
"*us_en.xml,*DE_de.edmx". All files matching the pattern will be excluded.Key
for fields in Java VDM entity classes that are defined to be part of the key. The annotation will be
added by the default annotation strategy of the Java VDM generator. Pre-delivered Java VDM entities
have this annotation applied to all key fields as well.withHttpHeader method
of fluent helpers called
withCustomHttpHeader,
which provides the same functionality in
a fluent manner and additionally has the option to specify headers only
for the actual OData request, but not any preflight request.scp-cf-tomcat archetype:cargo-maven2-plugin instead of jetty-maven-plugin in local
deployments to use a pure Tomcat. Accordingly, instead of mvn jetty:run, now
run the local deployment with mvn package cargo:run.jaxrs profile in TomEE Maven plugin of scp-cf-tomee archetype for
parity between local deployment and deployment on Cloud Foundry with the SAP Java Buildpack.scp-cf-spring archetype to 2.0.3.RELEASE.-XX:MaxPermSize flag from archetypes.cxf,
but mark them as optional instead.http would throw an
UnsupportedSchemeException.jackson libraries from 2.9.5 to 2.9.6 to prevent yet undisclosed vulnerability.
index.html welcome pages of archetypes.org.skyscreamer:jsonassert from BOM.AuthToken property in AuthTokenRequestContextListener as confidential
so that it is not written to logs.June 7, 2018 - Maven Central - Release blog
fromIdentifier to ofIdentifier.ScpCfCloudPlatform
now throw
NoServiceBindingException
or
MultipleServiceBindingsException
instead of returning an empty Optional.raml-api-console module has been removed. If you still need
this module, refer to a previous release.@NonNull annotations have been replaced with the JSR-305
@Nonnull annotation to provide a cleaner API contract using only JSR-305
annotations.ScpCfService
for access to services on Cloud Foundry including OAuth2 authentication flow.AuditedDataObject
for information about the data being accessed/modified and
AuditableDataSubject
for the owner of the data being accessed/modified.objectId and objectName by
parameters expecting AuditedDataObject and AuditableDataSubject.
message except for security event audit log
messages.AccessRequester
along with automatic retrieval from current requests. If you experience issues with tenant
identifiers in tests, make sure to mock the tenant using
mockCurrentTenant()
in MockUtil.Jwt and JwtDecoder classes with DecodedJWT provided
by java-jwt.isConfidential
flag to Property to indicate whether a property must be handled confidentially, e.g.,
by not writing its contained value and exception to the log.httpcore) and 4.5.5 (client libraries).com.sap.cloud:neo-javaee7-wp-api to 1.24.13 (also in archetype
scp-neo-javaee7).scp-cf-spring archetype, while keeping human-readable logs in local deployment.
slf4j-simple for unit and integration tests in all archetypes. You can now
easily set the log level of all classes in tests with
-Dsurefire.logLevel=<level>.RfcQuery.
May 23, 2018 - Maven Central - Release blog
java.time classes of Java 8. In particular, in the Java VDM,
replace deprecated Calendar type with LocalDateTime,
LocalTime, and ZonedDateTime classes as type of entity
fields depending on their EDM type.FluentIterable,
Optional, Function, Predicate and
Supplier with corresponding native Java 8 types.Executable
no longer inherits from Callable and is now annotated with
@FunctionalInterface.
RequestContextExecutor
has been adjusted accordingly to accept both Callable and
Executable as Lambda expressions.HystrixUtil
command key methods. The CachingCommand now uses
CacheKey.ofTenantAndUserIsolation()
by default.ALLOW_MOCKED_AUTH_HEADER
environment variable to true to mock a tenant and still use the
destination service.AuditLogger
to DefaultLoggerAuditLog on Cloud Foundry. This is to always ensure
proper audit logging. If there is an issue while accessing the required audit
logging dependencies, an
AuditLogAccessException
is now thrown.MockUtil:
MockUtil no longer disables the lookups of the
FacadeLocator.
MockUtil no longer overrides the RequestContextFacade on
the class path with HystrixRequestContextFacade. MockUtil
now returns the SecretStore and KeyStore instances for
certain methods.
MockUtil.mockDefaults()
no longer mocks the audit log by default. If you need to mock the audit log, use
MockUtil.mockAuditLog().
Optionals in
TenantAccessor,
UserAccessor,
and
SecretStoreAccessor.
AuthTokenAccessor
now only returns an empty Optional if either no request is available,
or no "Authorization" header is present. Consequently, the
TenantAccessor on Cloud Foundry considers a tenant unavailable
according to the availability of an
AuthToken.
The UserAccessor on Cloud Foundry considers a user unauthenticated
according to the availability of an AuthToken.ErpEndpoint, only use
ErpConfigContext
instead.EjbUtil.RequestContextAccessor.getRequestContextProperty(). Access
properties directly via
RequestContext.getProperty()
instead.requestContextExecutor() in class MockUtil.
Use
new RequestContextExecutor()
instead.RequestContext
now uses a custom class
Property
to represent a property with a certain value or exception if the value could not be
determined.AuditLogAccessException
to indicate issue when accessing audit log.ScpNeoHystrixBootstrapListener. This is now replaced by a
standard Java ServiceLoader.toQuery methods of the fluent helpers throw
ODataException.CacheKey
and apply unified namings with of constructor methods.ConvertedObject
with of constructor methods and fix misspelled "convertable", using
"convertible" instead.getXOrNull, but the methods are now called
getXIfPresent to better reflect the return type Optional.
ResponseBuilder to
ErrorResponseBuilder
to better reflect the purpose of this class.ErpServiceUriBuilder to
ServiceUriBuilder
com.sap.cloud.s4hana.frameworks:cxf, but rather use provided scope. As
a consequence, you must include the Apache CXF framework yourself in case your
target runtime does not include it already.scp-cf-tomee archetype to 1.7.5.
scp-cf-spring archetype to 2.0.2.RELEASE.
spring-web version to 5.0.6.RELEASE.com.sap.cloud.sdk.s4hana.datamodel.odata.services),
new operations in previously existing services, and new entity types.
The SDK supports all OData services listed in the SAP API Business Hub for
SAP S/4HANA Cloud.
withHttpHeader
method to all fluent helpers. This adds the String-typed key and value pairs to the HTTP headers of
all underlying OData requests.ErpConfigContext
into the HTTP headers of all OData requests. To pass in different values than the default, create an
ErpConfigContext object with the desired locale and/or SAP client and call the
execute()
method of the fluent helper with the ErpConfigContext object as a parameter.resetChangedFields()
method to all VDM entities to reset the currently tracked changed fields for update requests.USE_MOCKED_TENANT and USE_MOCKED_USER environment variables for
fine-granular control over mocking at runtime."") and/or mocked user ("") instead of an actual tenant or user,
respectively.MockUtil
now uses the AuditLog, CloudPlatform,
GenericDestination/Destination/RfcDestination,
Tenant, User, and SecretStore type of the respective Cloud
platform for mocking based on the chosen dependency of Cloud Foundry or Neo.MockUtil to allow mocking of GenericDestinations.ODataField
annotations to externalize the expected OData types.isKeyField()
to entity property models supplied to annotation strategy.com.sap.cloud.servicesdk.prov:odatav4 to the dependencies of a project.ServiceLoader instead of a bootstrap listener to make it easier to use Hystrix
during app startup.SerializedQuery
now not only supports POST, but also additional HTTP methods defined by
RequestMethod.
java.lang.IllegalArgumentException: Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD
issue in SoapRemoteFunctionQuerySerializer on Java EE 7.ClassNotFoundExceptions instead
of the message provided by the respective assertRuntimeDependenciesExist() method.May 10, 2018 - Maven Central - Release blog
includingFields
method to manually specify fields to include.C_Behqueuedata is now
Behqueuedata,
I_BusinessObjectKeys is now
BusinessObjectKeys,
and I_BusObjects is now
BusObjects.
Corresponding fluent helpers and other names have changed similarly as well.includingFields
method of the fluent helper.--generate-pojo-only, Maven plugin
configuration pojosOnly).AnnotationStrategy.
DefaultAnnotationStrategy
as basis (super class) for custom annotation strategies.--annotation-strategy-class <fully-qualified-class-name>, the Maven
plugin configuration property annotationStrategy..xml files (in addition to .edmx).BusinessEventQueue
service.April 12, 2018 - Maven Central - Release blog
javax.inject is no longer transitively provided by some modules
of the SAP S/4HANA Cloud SDK. You may need to add a dependency on
javax.inject:javax.inject to your pom.xml if you depend on it.JwtBearer class has been replaced by
AuthToken.
sap:label attribute) to
derive the VDM name of entities and their properties. You can use the old strategy to use
the name instead with the corresponding command line interface (CLI) option
--use-odata-names or the Maven plugin parameter nameSource set to
NAME.NamingStrategy
to define the mapping of metadata names and labels to Java identifiers. Supply the fully
qualified name of your class implementing this interface via the parameter
--name-strategy-class (CLI) / namingStrategy (Maven plugin).generate to allow calling the Maven plugin (when
configured) via mvn odata-generator:generatePATCH request and only
send fields of the entity with non-null values.ETag version identifier during read-by-key requests and supplying it as
If-Match header during update requests.
ETag version identifier manually on all entities.AuthTokenAcccessor
to transparently access the current authorization token on SAP Cloud Platform Cloud Foundry.RequestContextListeners
to debug instead of warn to avoid unnecessary warnings in situations where
this behavior is expected.DestinationPathsNotMergeableException
in
UriPathMerger.
javax.inject module from compile to provided in
odata-api and bapi-api modules.JmxMonitor that occurred when deploying more than one
application to the same container.March 29, 2018 - Maven Central - Release blog
com.sap.cloud.s4hana.datamodel:odata-generator-cli
as a fat
jar that can be called via java -jar odata-generator-cli-1.9.4.jar.
com.sap.cloud.s4hana.datamodel:odata-generator-maven-plugin,
bound to the generate-sources phase.DataModelGenerator
builder class.cx-server).
cx-server script.DestinationAccessException
occurred on SAP Cloud Platform Cloud Foundry when a subaccount had an on-premise destination
configured and the application was not bound to a connectivity service instance, even if this
destination was never used.
Destination#getProxyConfiguration
may now throw a DestinationAccessException to indicate an issue while accessing
the destination.scp-neo-javaee7 archetype.March 15, 2018 - Maven Central - Release blog
ODataQueryBuilder. Please find the release
notes of the SAP Cloud Platform SDK for service development at help.sap.com.or
and
not
to support complex filter expressions (together with the already previously existing
and
operator).scp-neo-maven-plugin.February 15, 2018 - Maven Central - Release blog
com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.* (same name
as interface, but in lower case and without suffix "Service") have also been changed. In
detail, the following changes have been made:CreateAndUpdateCommercialProjectsService
to CommercialProjectService.ProcessSalesOrderService
to SalesOrderService.ProcessPurchaseOrdersService
to PurchaseOrderService.ReadCostCenterDataService to
CostCenterService, BillOfMaterialMaintainService to
BillOfMaterialsService, ReadGorlAccountService to
GeneralLedgerAccountService,
ManageWorkforceAvailabiltyService to
WorkforceAvailabilityService,
EnableExternalJobSchedulerIntegrationService to
ExternalJobSchedulerIntegration, ReadAndUpdatePirsService
to PlannedIndependentRequirementService.CostCenterCategory.
They are used as types of parameters of BAPI service methods. The functional scope of the
fluent API has not changed. In order to update your application, please exchange the old
class names with the new ones, suggested by your IDE. You still use the same primitive
parameter values used to contruct those single value types.EjbUtil helper class has been deprecated, as its functionality is no longer
required in newer JavaEE containers.com.sap.cloud.sdk.s4hana.datamodel.odata.services),
new operations in previously existing services, and new entity types.
The SDK supports all OData services listed in the SAP API Business Hub for
SAP S/4HANA Cloud.
com.sap.cloud.s4hana.frameworks:spring-web
that provides a ready-to-use
exception mapper for Spring applications.
The exception mapper logs all unhandled exceptions with a reference ID and fills the response with
the error description, without the stacktrace.destinations so far available for Cloud Foundry-based
applications can now be used independent of the underlying Cloud platform environment, enabling
consistent local testing of connectivity across environments.random-route property by default in manifest.yml by default as
part of all Cloud Foundry archetypes, so that the question for a unique hostname is not needed
anymore.frameworks.* packages.GsonMessageBodyProvider
to a separate
com.sap.cloud.s4hana.frameworks:jaxrs-gson
module to avoid conflicts with other providers like Jackson.Edm.Binary.
@Named
annotation to avoid conflicts between service classes using the same names in the VDM for OData and
BAPI.scp-cf-spring archetype due to missing
@ComponentScan annotation.February 1, 2018 - Maven Central - Release blog
com.sap.cloud.s4hana.frameworks:cxf module to a new JAX-RS framework module
named com.sap.cloud.s4hana.frameworks:jaxrs. Some classes have been moved
accordingly:
GsonMessageBodyProvider
from package com.sap.cloud.sdk.frameworks.cxf.jaxrs to
com.sap.cloud.sdk.frameworks.jaxrs,JaxRsErrorResponseBuilder
and
JaxRsExceptionMapper
from com.sap.cloud.sdk.frameworks.cxf.jaxrs to
com.sap.cloud.sdk.frameworks.jaxrs.response, andNotFoundExceptionMapper
and
WebApplicationExceptionMapper
from com.sap.cloud.sdk.frameworks.cxf.servlet.response.mapper to
com.sap.cloud.sdk.frameworks.jaxrs.response.mapper.TenantNotFoundException to
TenantNotAvailableException,
KeyStoreException to
KeyStoreNotFoundException,
andSecretStoreException to
SecretStoreNotFoundException.
TenantAccessException
and
UserAccessException
for a cleaner contract on the tenant and user accessors and facades; rename
TenantNotFoundException to
TenantNotAvailableException.
KeyStoreAccessException
and
SecretStoreAccessException
for a cleaner contract on the secret store accessor and facade; rename
KeyStoreException to
KeyStoreNotFoundException
and SecretStoreException to
SecretStoreNotFoundException.
cloudplatform.* packages.tomcat-catalina lib from TomEE Maven plugin configuration in
application/pom.xml generated by scp-cf-tomee archetype in order to fix
local deployment issues (e.g.,
java.lang.NoSuchMethodError: org.apache.tomcat.util.ExceptionUtils.preload()V) on some
developer machines.RequestContextListeners for SAP Cloud Platform, Neo to avoid
failing JNDI lookups in non-container managed threads.HystrixUtil.getUserIsolatedKey
not considering tenant context (this may have caused circuit breakers to trigger for users with the
same name across different tenants).FacadeLocator.January 18, 2018 - Maven Central - Release blog
org.jboss.arquillian.junit:arquillian-junit-container obsolete.
This dependency has been removed from the SDK BOM, you may have to either remove the
dependency from your integration-tests/pom.xml file or add a version to it
(e.g., 1.1.5.Final).DestinationType
is now an enum instead of a class to better reflect the available destination types.com.sap.cloud.s4hana.archetypes:scp-neo-javaee7 for Java EE 7 on SAP
Cloud Platform Neo.FeatureToggleServlet.
SchemaPerTenantProvisioner
for liquibase.LogInputSanitizer
that can be used to prevent log forging.
LogInputSanitizer comes with an END_OF_LOG token (by default:
(END OF LOG ENTRY)) that will be appended to the end of each log entry.DestinationType,
AuthenticationType,
and
ProxyType
now provide methods for handling conversion from and to String identifiers.AuthenticationType
enum values which are available on SAP Cloud Platform Neo and/or Cloud Foundry.Destination
interface: improve contract on some methods that may throw a DestinationAccessException
and add method getDescription().newTenantIsolatedOrGlobalKey
to CacheKey.getTenantIsolatedOrGlobalKey
to HystrixUtil.com.sap.cloud.s4hana.cloudplatform:concurrency-scp-neo.MockUtil.mockErpServer
and
MockUtil.mockServer.
ClientAndServer object, the affected
MockUtil methods now return a WireMockRule.toString method of destinations now replaces sensitive information such as
passwords with the String (hidden).December 21, 2017 - Maven Central - Release blog
to[NavigationProperty] to [navigationProperty] in order to improve
readability.EntityField instance now expect entity type-specific instances, for example,
BusinessPartnerField
(only relevant if you used your own EntityField instances, for example, to represent custom
fields).BusinessPartner.BUSINESS_PARTNER_U_U_ID has been renamed to
BusinessPartner.BUSINESS_PARTNER_UUID).select
method of fluent helpers. Please note that there is no separate expand method.getAllBusinessPartner().select( BusinessPartner.TO_BUSINESS_PARTNER_ROLE, BusinessPartner.TO_BUSINESS_PARTNER_ADDRESS.select(BusinessPartnerAddress.COUNTRY) )to retrieve all business partners with their roles (all fields of role) and the country field of their addresses.
BusinessPartner.builder().businessPartnerAddress(...) to add addresses while
constructing an entity.set[NavigationProperty] and
add[NavigationProperty], no longer attempt to fetch the associated entities first.com.sap.cloud.sdk.s4hana.connectivity.rfc
and
com.sap.cloud.sdk.result).
doCommit in BapiQuery and RfcQuery to
isPerformingTransactionalCommit.
doCommit is now deprecated.LocalDate and
LocalTime when accessing BAPI and RFM results.AuditLoggingStateRepository
(Togglz integration).AutorizationApiDestination to AuthorizationApiDestination.December 7, 2017 - Maven Central - Release blog
getField to
getCustomField
(hasCustomField,
getCustomFieldNames)
in order to clearly indicate that they deal with custom fields (i.e., extensions in
S/4HANA).get[NavigationProperty]OrNull and get[NavigationProperty]OrFetch
(examples:
BusinessPartner.getBusinessPartnerAddressOrFetch
and
BusinessPartner.getBusinessPartnerAddressOrNull).
set[NavigationProperty] (to overwrite)
and, in case of 1:n associations, add[NavigationProperty] (examples:
BusinessPartner.setBusinessPartnerAddress
and
BusinessPartner.addBusinessPartnerAddress).
setCustomField.
ODataVdmErrorResultHandler
used by default in all VDM operations exposes more information about exceptions that occur during
calls of the VDM.getCustomFields
returns a map of all custom fields of an entity and their values. November 23, 2017 - Maven Central - Release blog
_RFC, for example,
ErpQueryEndpoint_RFC.
See the explanation of the different options for the ErpConfigContext.
cx-server script.November 9, 2017 - Maven Central
new or inject them if using a JSR 330
compliant framework.
This simplifies testing and extensibility.
Each service class provides a default implementation starting with prefix
"Default".
void instead of the instance itself.
Use the builder() methods instead.
createBusinessPartner in class
BusinessPartnerService).execute methods:
execute with an
ErpEndpoint argumentexecute without any parameter. In this case the default
ErpConfigContext is considered.getField method of the derived
entity class.
hasField and getFieldNames can be used to determine which fields are
available.void instead of instance.
Use the respective builder() methods instead.
ErpEndpoint and
ErpConfigContext.October 26, 2017 - Maven Central
scp-neo-javaee6 archetype. It is strongly encouraged for Maven projects using
starter parents to migrate to explicit configuration
of properties and plugins.
trustStorePassword to
mockDestination()
and
mockErpDestination().
To migrate to these methods, set
trustStorePassword to
null where ever previous versions of these methods were called.
ErpSystemInfo.
scp-neo-maven-plugin in the
scp-neo-javaee6 archetype uses a non-existing version. Please use version
1.2.0 instead of the declared version
1.2.0-SNAPSHOT when generating a new project from this archetype.getTrustStorePassword()
to
Destination.
newUserOrTenantIsolatedKey()
to
CacheKey
for a more graceful construction.getUserOrTenantIsolatedKey()
to
HystrixUtil
to more gracefully obtain a
Command
key.withErrorHandler() and
toQuery() methods in the OData virtual data model.mockErpServer()
method with
destinationName parameter.SapClient
optional in
mockErpServer()
methods.CacheKey.
ByKeyFluentHelper.ErpEndpoint)
to enable easier mocking.QueryExecutionMeasurements
to be measured as request building duration.ODataVdmErrorResultHandler
to extend
DefaultErrorResultHandler instead of implementing
ErrorResultHandler.mockErpDestination()
adding a
sap-client header which ignores the
SapClient
in the
ErpConfigContext.
October 12, 2017 - Maven Central
Details on the incompatible changes can be found here.
toQuery() method to all service classes of the S/4HANA virtual data model for OData.
ODataQuery without executing it.
ODataVdmErrorResultHandler
to provide more meaningful OData error messages.
index.html to web application root of all archetypes.finalName in web descriptor of
scp-neo-javaee6 archetype.ConnectionManager in
DestinationsRequestContextListener.
getByKey() methods of the S/4HANA virtual data model for OData.September 29, 2017 - Maven Central
fetch instead of
get.
For example, a property that was previously named
getItem() is now called
fetchItem().
DestinationType
to represent different destination types.
GenericDestination
as generic base interface for all destination types.
RfcDestination
to represent
RFC
destinations.
DestinationAccessor
for additional destination types.
destinations environment variable. For details, see
ScpCfDestinationFacade.
mvn tomee:run and
mvn jetty:run in TomEE and Tomcat archetypes for Cloud Foundry.DestinationAccessor
now throws
DestinationOAuthTokenException
for missing OAuth tokens.
MockUtil
now throws
TestConfigurationError
instead of
ShouldNotHappenException
for test configuration issues.
MockUtil
now redirects audit logs to the default test log instead of ignoring them.
compile instead of
provided.September 14, 2017 - Maven Central