{"id":2353,"date":"2026-05-12T10:00:00","date_gmt":"2026-05-12T07:00:00","guid":{"rendered":"https:\/\/commerce-consulting-services.com\/en\/?p=2353"},"modified":"2026-03-24T09:46:52","modified_gmt":"2026-03-24T07:46:52","slug":"sap-commerce-spring-6-java-21-migration","status":"publish","type":"post","link":"https:\/\/commerce-consulting-services.com\/lv\/sap-commerce-spring-6-java-21-migration\/","title":{"rendered":"Spring Framework 6 and Java 21 Migration for SAP Commerce Cloud"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Hero&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; custom_padding=&#8221;0vw||80px||false|false&#8221; locked=&#8221;off&#8221; collapsed=&#8221;on&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_row _builder_version=&#8221;4.18.0&#8243; _module_preset=&#8221;5138c454-be54-4233-bd3b-f8e6a8747976&#8243; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.18.0&#8243; _module_preset=&#8221;73121f80-a3ef-4484-8763-c3f18e3c56d2&#8243; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;SAP Commerce&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;f0c675ea-2574-4d0e-b725-30f8550a8550&#8243; title_level=&#8221;h4&#8243; title_font=&#8221;IBM Plex Sans|IBM Plex Sans Condensed_weight||on|||||&#8221; title_text_color=&#8221;#1d3557&#8243; title_font_size=&#8221;14px&#8221; title_letter_spacing=&#8221;1px&#8221; title_line_height=&#8221;1.4em&#8221; custom_margin=&#8221;||10px||false|false&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{%22#1d3557%22:%91%22title_text_color%22%93}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_heading title=&#8221;Spring Framework 6 and Java 21 Migration for SAP Commerce Cloud&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;ddeb8c09-9078-4424-bc15-2efb6572e28e&#8221; title_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_post_title title=&#8221;off&#8221; meta=&#8221;off&#8221; featured_image=&#8221;on&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_post_title][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>SAP Commerce Cloud&#8217;s move to Spring Framework 6 and Java 21 is one of the most impactful technical changes to hit the platform in years. Unlike a typical patch release that you can absorb over a sprint, this migration touches the foundations: the dependency injection framework, the servlet API, the security layer, and the JVM itself. If you have custom extensions (and every real-world SAP Commerce implementation does), you have work to do.<\/p>\n<p>This article is written for developers and architects who need to plan and execute this migration. We will cover what changes, what breaks, how to fix it, and how to test it. This is a technical guide, not a management overview.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Why This Is Happening&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>SAP Commerce Cloud has historically run on Spring Framework 5.x and Java 17 (or earlier). The broader Java ecosystem has moved forward substantially:<\/p>\n<ul>\n<li><strong>Spring Framework 5.x<\/strong> reached end of open-source support in August 2024. Security patches for 5.3.x are only available through commercial support. Spring 6 is the current actively developed branch.<\/li>\n<li><strong>Java 17<\/strong> is in LTS maintenance, but Java 21 is the new LTS baseline with significant improvements in performance, language features, and runtime capabilities.<\/li>\n<li><strong>Jakarta EE 9+<\/strong> replaced the <code>javax<\/code> namespace with <code>jakarta<\/code>, affecting the Servlet API, JPA, Bean Validation, and numerous other specifications.<\/li>\n<\/ul>\n<p>SAP is aligning Commerce Cloud with these ecosystem shifts. The specific version and timeline depends on your Commerce Cloud release train, but the direction is clear: Spring 6 and Java 21 are the new baseline, and custom code that does not comply will not compile.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;The Big Three Changes&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>Before diving into step-by-step migration, understand the three categories of changes that will affect your codebase.<\/p>\n<h3>1. Jakarta EE Namespace Migration (javax to jakarta)<\/h3>\n<p>This is the most mechanically pervasive change. The Jakarta EE community renamed the package namespace from <code>javax.*<\/code> to <code>jakarta.*<\/code> starting with Jakarta EE 9. This affects:<\/p>\n<ul>\n<li><strong>Servlet API:<\/strong> <code>javax.servlet.*<\/code> becomes <code>jakarta.servlet.*<\/code><\/li>\n<li><strong>JPA\/Persistence:<\/strong> <code>javax.persistence.*<\/code> becomes <code>jakarta.persistence.*<\/code><\/li>\n<li><strong>Bean Validation:<\/strong> <code>javax.validation.*<\/code> becomes <code>jakarta.validation.*<\/code><\/li>\n<li><strong>Annotations:<\/strong> <code>javax.annotation.*<\/code> becomes <code>jakarta.annotation.*<\/code><\/li>\n<li><strong>Mail:<\/strong> <code>javax.mail.*<\/code> becomes <code>jakarta.mail.*<\/code><\/li>\n<li><strong>WebSocket:<\/strong> <code>javax.websocket.*<\/code> becomes <code>jakarta.websocket.*<\/code><\/li>\n<li><strong>JSON Processing\/Binding:<\/strong> <code>javax.json.*<\/code> becomes <code>jakarta.json.*<\/code><\/li>\n<\/ul>\n<p>Importantly, not everything under <code>javax<\/code> changed. <code>javax.sql.*<\/code>, <code>javax.crypto.*<\/code>, <code>javax.net.*<\/code>, and other packages that are part of the core JDK (not Jakarta EE) remain unchanged.<\/p>\n<p>The sheer number of files affected can be daunting, but the change itself is mechanical. The challenge is finding every occurrence, including in configuration files, XML descriptors, and string literals, not just Java imports.<\/p>\n<h3>2. Spring Framework 6 API Changes<\/h3>\n<p>Beyond the namespace migration, Spring 6 introduces its own set of breaking changes:<\/p>\n<p><strong>Spring Security overhaul.<\/strong> If you have custom security configurations (and most SAP Commerce implementations do), this is where you will spend significant time. Key changes:<\/p>\n<ul>\n<li><code>WebSecurityConfigurerAdapter<\/code> is removed. Security configuration must use the component-based <code>SecurityFilterChain<\/code> bean approach.<\/li>\n<li><code>antMatchers()<\/code>, <code>mvcMatchers()<\/code>, and <code>regexMatchers()<\/code> are replaced by <code>requestMatchers()<\/code>.<\/li>\n<li>CSRF configuration changes. The default behavior is stricter, and the configuration API has changed.<\/li>\n<li>OAuth2 client and resource server configurations have been restructured.<\/li>\n<\/ul>\n<p><strong>Removed deprecated APIs.<\/strong> Spring 6 removes APIs that were deprecated in Spring 5. If you ignored deprecation warnings (most teams do), those warnings are now compilation errors. Common casualties:<\/p>\n<ul>\n<li><code>RestTemplate<\/code> is not removed but is in maintenance mode. Spring recommends <code>WebClient<\/code> or the new <code>RestClient<\/code> for new code.<\/li>\n<li>Various <code>org.springframework.web.servlet.mvc.Controller<\/code> methods have changed signatures.<\/li>\n<li><code>AsyncRestTemplate<\/code> is removed entirely. Use <code>WebClient<\/code> instead.<\/li>\n<\/ul>\n<p><strong>HTTP interface changes.<\/strong> Spring 6 requires Servlet 6.0+ (part of the Jakarta EE shift). Filter chains, interceptors, and custom <code>DispatcherServlet<\/code> configurations may need adjustment.<\/p>\n<h3>3. Java 21 Language and Runtime Changes<\/h3>\n<p>Java 21 is generally backward-compatible with Java 17 code, but there are breaking changes and new capabilities to be aware of:<\/p>\n<p><strong>Removed APIs and features:<\/strong><\/p>\n<ul>\n<li>Security Manager is deprecated for removal. If any of your code or dependencies use <code>System.setSecurityManager()<\/code> or security policy files, those need to be reworked.<\/li>\n<li>Several <code>java.lang<\/code> and <code>java.util<\/code> methods deprecated in earlier versions are now removed.<\/li>\n<li>The default garbage collector behavior has changed (more on this in the performance section).<\/li>\n<\/ul>\n<p><strong>New capabilities worth leveraging:<\/strong><\/p>\n<ul>\n<li><strong>Virtual threads (Project Loom):<\/strong> Lightweight threads that can dramatically improve throughput for I\/O-bound operations. Relevant for integration-heavy commerce platforms.<\/li>\n<li><strong>Pattern matching for switch:<\/strong> Cleaner code for type-checking and dispatching.<\/li>\n<li><strong>Record patterns:<\/strong> Useful for DTOs and value objects.<\/li>\n<li><strong>Sequenced collections:<\/strong> New interfaces (<code>SequencedCollection<\/code>, <code>SequencedSet<\/code>, <code>SequencedMap<\/code>) that provide uniform access to first\/last elements.<\/li>\n<\/ul>\n<p>You do not have to adopt new Java 21 features during the migration. Focus first on making existing code compile and run correctly. Adopt new features in subsequent iterations.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Step-by-Step Migration Approach&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<h3>Step 1: Assess Your Custom Code Surface Area<\/h3>\n<p>Before changing any code, understand what you are dealing with. Run these assessments across your custom extensions:<\/p>\n<p><strong>Count namespace occurrences:<\/strong><\/p>\n<pre><code class=\"language-bash\"># Count javax imports that need migration\ngrep -rn &quot;import javax\\.\\(servlet\\|persistence\\|validation\\|annotation\\|mail\\|websocket\\|json\\)&quot; \\\n  --include=&quot;*.java&quot; your-extensions\/ | wc -l\n\n# Count Spring Security adapter usage\ngrep -rn &quot;WebSecurityConfigurerAdapter\\|antMatchers\\|mvcMatchers\\|regexMatchers&quot; \\\n  --include=&quot;*.java&quot; your-extensions\/ | wc -l\n\n# Count deprecated Spring API usage\ngrep -rn &quot;AsyncRestTemplate\\|org\\.springframework\\..*deprecated&quot; \\\n  --include=&quot;*.java&quot; your-extensions\/ | wc -l\n<\/code><\/pre>\n<p><strong>Check XML and properties files:<\/strong><\/p>\n<pre><code class=\"language-bash\"># Check Spring XML configurations for affected classes\ngrep -rn &quot;javax\\.\\(servlet\\|persistence\\|validation\\)&quot; \\\n  --include=&quot;*.xml&quot; --include=&quot;*.properties&quot; your-extensions\/\n<\/code><\/pre>\n<p><strong>Review third-party dependencies:<\/strong><\/p>\n<p>Every JAR you bring into your SAP Commerce extensions needs to be compatible with Jakarta EE 10+ and Java 21. Create a dependency inventory and check each one for a compatible version. Common problem areas:<\/p>\n<ul>\n<li>Older versions of Guava, Apache Commons, Jackson, Gson<\/li>\n<li>Legacy SOAP client libraries<\/li>\n<li>Older database drivers<\/li>\n<li>Testing frameworks (JUnit 4 code may need updates for the new Spring Test context)<\/li>\n<\/ul>\n<h3>Step 2: Update Third-Party Dependencies First<\/h3>\n<p>Address your dependency chain before touching your own code. This is counterintuitive (most teams want to start with their own code), but dependency issues will block your compilation anyway, and resolving them first gives you a clean baseline.<\/p>\n<p>For each dependency:<\/p>\n<ol>\n<li>Check the latest version that supports Jakarta EE 9+ and Java 21<\/li>\n<li>Review the changelog for breaking changes<\/li>\n<li>Update the version in your build configuration<\/li>\n<li>Resolve any immediate compilation issues from the dependency update<\/li>\n<\/ol>\n<p>Common dependency updates:<\/p>\n<table>\n<thead>\n<tr>\n<th>Library<\/th>\n<th>Old Version (typical)<\/th>\n<th>New Version (Jakarta-compatible)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Jackson<\/td>\n<td>2.13.x<\/td>\n<td>2.17.x+<\/td>\n<\/tr>\n<tr>\n<td>Hibernate Validator<\/td>\n<td>6.x<\/td>\n<td>8.x+<\/td>\n<\/tr>\n<tr>\n<td>EhCache<\/td>\n<td>2.x<\/td>\n<td>3.x (or switch to JCache)<\/td>\n<\/tr>\n<tr>\n<td>Apache HttpClient<\/td>\n<td>4.x<\/td>\n<td>5.x<\/td>\n<\/tr>\n<tr>\n<td>Lombok<\/td>\n<td>1.18.24<\/td>\n<td>1.18.32+<\/td>\n<\/tr>\n<tr>\n<td>JUnit<\/td>\n<td>4.x \/ 5.8<\/td>\n<td>5.10+<\/td>\n<\/tr>\n<tr>\n<td>Mockito<\/td>\n<td>4.x<\/td>\n<td>5.x+<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Pay special attention to Hibernate. If you have custom JPA\/Hibernate code (outside the SAP Commerce Type System), the migration from Hibernate 5 to Hibernate 6 is substantial and involves more than just namespace changes.<\/p>\n<h3>Step 3: Perform the Namespace Migration<\/h3>\n<p>With dependencies updated, tackle the <code>javax<\/code> to <code>jakarta<\/code> namespace change in your custom code.<\/p>\n<p><strong>Automated approach:<\/strong> Use OpenRewrite, which has a recipe specifically for Jakarta EE migration:<\/p>\n<pre><code class=\"language-bash\"># Using OpenRewrite Gradle plugin\n.\/gradlew rewriteRun -Drewrite.activeRecipe=org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta\n<\/code><\/pre>\n<p>If your SAP Commerce build does not integrate easily with OpenRewrite (many do not due to the custom Ant-based build), you can use IntelliJ IDEA&#8217;s migration tool or a targeted find-and-replace approach:<\/p>\n<pre><code class=\"language-bash\"># Manual approach - careful, ordered replacements\n# Do these one at a time and verify compilation after each\n\nfind your-extensions\/ -name &quot;*.java&quot; -exec sed -i '' \\\n  's\/javax\\.servlet\/jakarta.servlet\/g' {} +\n\nfind your-extensions\/ -name &quot;*.java&quot; -exec sed -i '' \\\n  's\/javax\\.persistence\/jakarta.persistence\/g' {} +\n\nfind your-extensions\/ -name &quot;*.java&quot; -exec sed -i '' \\\n  's\/javax\\.validation\/jakarta.validation\/g' {} +\n\nfind your-extensions\/ -name &quot;*.java&quot; -exec sed -i '' \\\n  's\/javax\\.annotation\\.\\(PostConstruct\\|PreDestroy\\|Resource\\|Generated\\|Priority\\)\/jakarta.annotation.\\1\/g' {} +\n<\/code><\/pre>\n<p><strong>Do not blindly replace all <code>javax.*<\/code>.<\/strong> Remember that <code>javax.sql<\/code>, <code>javax.crypto<\/code>, <code>javax.net<\/code>, and JDK-provided packages stay as <code>javax<\/code>. This is the most common mistake in automated migrations.<\/p>\n<p>Also check:<\/p>\n<ul>\n<li><strong>web.xml files:<\/strong> Servlet filter and listener class references<\/li>\n<li><strong>Spring XML configurations:<\/strong> Bean class references that use <code>javax<\/code> types<\/li>\n<li><strong>properties files:<\/strong> Any property values that reference <code>javax<\/code> classes<\/li>\n<li><strong>ImpEx files:<\/strong> Unlikely but check if any ImpEx scripts reference Java types<\/li>\n<\/ul>\n<h3>Step 4: Migrate Spring Security Configuration<\/h3>\n<p>If you have custom Spring Security configurations (most SAP Commerce implementations customize authentication, authorization, or CSRF handling), this step requires careful manual work.<\/p>\n<p><strong>Before (Spring Security 5):<\/strong><\/p>\n<pre><code class=\"language-java\">@Configuration\n@EnableWebSecurity\npublic class CustomSecurityConfig extends WebSecurityConfigurerAdapter {\n\n    @Override\n    protected void configure(HttpSecurity http) throws Exception {\n        http\n            .authorizeRequests()\n                .antMatchers(&quot;\/api\/public\/**&quot;).permitAll()\n                .antMatchers(&quot;\/api\/admin\/**&quot;).hasRole(&quot;ADMIN&quot;)\n                .anyRequest().authenticated()\n            .and()\n            .csrf()\n                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());\n    }\n}\n<\/code><\/pre>\n<p><strong>After (Spring Security 6):<\/strong><\/p>\n<pre><code class=\"language-java\">@Configuration\n@EnableWebSecurity\npublic class CustomSecurityConfig {\n\n    @Bean\n    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n        http\n            .authorizeHttpRequests(auth -&gt; auth\n                .requestMatchers(&quot;\/api\/public\/**&quot;).permitAll()\n                .requestMatchers(&quot;\/api\/admin\/**&quot;).hasRole(&quot;ADMIN&quot;)\n                .anyRequest().authenticated()\n            )\n            .csrf(csrf -&gt; csrf\n                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())\n            );\n        return http.build();\n    }\n}\n<\/code><\/pre>\n<p>Key changes to note:<\/p>\n<ul>\n<li>No more extending <code>WebSecurityConfigurerAdapter<\/code><\/li>\n<li>Configuration uses lambda DSL (the <code>.and()<\/code> chaining pattern is deprecated)<\/li>\n<li><code>authorizeRequests()<\/code> becomes <code>authorizeHttpRequests()<\/code><\/li>\n<li><code>antMatchers()<\/code> becomes <code>requestMatchers()<\/code><\/li>\n<li>CSRF, CORS, and other security configurations use lambda-style configuration<\/li>\n<\/ul>\n<p>If you have custom <code>AuthenticationProvider<\/code>, <code>UserDetailsService<\/code>, or <code>Filter<\/code> implementations, review them for compatibility. The core contracts are mostly the same, but some edge cases in how filters are ordered and how authentication events are published have changed.<\/p>\n<h3>Step 5: Fix Remaining Compilation Errors<\/h3>\n<p>After the namespace migration and Spring Security update, attempt a full build. Collect all remaining compilation errors and address them systematically.<\/p>\n<p>Common issues at this stage:<\/p>\n<ul>\n<li><strong>Removed Spring APIs:<\/strong> Replace with the recommended alternatives (check Spring&#8217;s migration guide for each removed class\/method)<\/li>\n<li><strong>Type inference changes in Java 21:<\/strong> Rare, but some generic type inference edge cases behave differently<\/li>\n<li><strong>Reflection access:<\/strong> Java 21 is stricter about reflective access to internal JDK APIs. If you see <code>InaccessibleObjectException<\/code>, you need to add <code>--add-opens<\/code> JVM flags or (better) stop accessing internal APIs<\/li>\n<li><strong>Classpath vs module path:<\/strong> While SAP Commerce does not fully embrace JPMS modules, some libraries now ship as modules. Classpath conflicts may surface differently<\/li>\n<\/ul>\n<h3>Step 6: Update Build Configuration<\/h3>\n<p>Your build system configuration needs updates for Java 21:<\/p>\n<p><strong>JVM flags:<\/strong> Java 21 may require additional <code>--add-opens<\/code> flags for frameworks that use deep reflection (Hibernate, Spring, serialization libraries). SAP typically documents the required flags for each Commerce release.<\/p>\n<p><strong>Compiler settings:<\/strong> Ensure your build targets Java 21:<\/p>\n<pre><code class=\"language-properties\"># In your build configuration\njava.source=21\njava.target=21\n<\/code><\/pre>\n<p><strong>Gradle\/Ant updates:<\/strong> If you use Gradle for any part of your build, ensure you are on Gradle 8.5+ (required for full Java 21 support). For the Ant-based Commerce build, follow SAP&#8217;s documentation for the specific version requirements.<\/p>\n<p><strong>Test frameworks:<\/strong> Ensure your test runner and assertion libraries are compatible. JUnit 5.10+ and Mockito 5.x+ are the safe choices for Java 21.<\/p>\n<h3>Step 7: Testing Strategy<\/h3>\n<p>Migration testing has three layers, and you need all of them.<\/p>\n<p><strong>Layer 1: Compilation and Unit Tests<\/strong><\/p>\n<p>The first gate is simply getting the code to compile and unit tests to pass. Expect some test failures due to:<\/p>\n<ul>\n<li>Mocking framework changes (Mockito 5 has stricter defaults about mocking final classes)<\/li>\n<li>Spring Test context changes (how test application contexts are initialized)<\/li>\n<li>Assertion library compatibility<\/li>\n<\/ul>\n<p>Fix these methodically. Do not skip failing tests &#8211; they exist for a reason.<\/p>\n<p><strong>Layer 2: Integration Tests<\/strong><\/p>\n<p>SAP Commerce-specific integration tests (those extending <code>ServicelayerTransactionalTest<\/code> or similar base classes) verify that your code works within the Commerce runtime. These tests are critical because they exercise the actual Spring context, type system, and service layer.<\/p>\n<p>Run these in a CCv2 development environment or a local Commerce instance running on Java 21. Pay special attention to:<\/p>\n<ul>\n<li>Service layer injection (Spring context must resolve all beans correctly)<\/li>\n<li>Interceptor chains (model interceptors, event listeners)<\/li>\n<li>Cron job execution<\/li>\n<li>ImpEx import\/export<\/li>\n<\/ul>\n<p><strong>Layer 3: End-to-End Functional Tests<\/strong><\/p>\n<p>Once unit and integration tests pass, run your full regression suite. Key areas to validate:<\/p>\n<ul>\n<li>Checkout flow (the most integration-heavy path)<\/li>\n<li>Backoffice operations (SmartEdit, Product Cockpit, etc.)<\/li>\n<li>API endpoints (OCC REST API responses)<\/li>\n<li>Search and indexing (Solr integration)<\/li>\n<li>Background processes (order processing, data sync jobs)<\/li>\n<\/ul>\n<h3>Step 8: Performance Validation<\/h3>\n<p>Java 21 brings performance improvements, but your specific workload may behave differently. Validate before go-live.<\/p>\n<p><strong>Garbage Collection:<\/strong> Java 21&#8217;s default GC (G1) has received significant improvements. If you were using G1 on Java 17, you should see modest throughput improvements. If you were using ZGC or Shenandoah for low-latency requirements, both are more mature in Java 21.<\/p>\n<p>Review your GC configuration:<\/p>\n<pre><code class=\"language-properties\"># Common GC flags to review and adjust for Java 21\n-XX:+UseG1GC\n-XX:MaxGCPauseMillis=200\n-XX:G1HeapRegionSize=16m\n-XX:InitiatingHeapOccupancyPercent=45\n<\/code><\/pre>\n<p>Java 21&#8217;s G1 improvements may allow you to relax some of these tuning parameters. Run load tests with your current settings first, then experiment.<\/p>\n<p><strong>Virtual Threads:<\/strong> Java 21&#8217;s virtual threads (from Project Loom) are a significant opportunity for I\/O-bound workloads, which describes most e-commerce platforms. A typical product page load involves database queries, cache lookups, Solr searches, and potentially external API calls, all I\/O operations that block platform threads.<\/p>\n<p>Virtual threads allow you to use <code>Executors.newVirtualThreadPerTaskExecutor()<\/code> instead of traditional thread pools. The JVM handles scheduling with dramatically lower overhead per thread. For integration-heavy flows (order processing, inventory sync), this can significantly improve throughput without increasing hardware.<\/p>\n<p>However, do not adopt virtual threads during the initial migration. Get everything working on platform threads first. Virtual thread adoption is an optimization to pursue after the migration is stable.<\/p>\n<p><strong>Startup time:<\/strong> Java 21 with Spring 6 may have different startup characteristics. Measure cold start and warm-up times in your CCv2 environments, as this affects deployment and scaling behavior.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Dependency Audit Checklist&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>Run through this checklist for every third-party dependency in your custom extensions:<\/p>\n<ul>\n<li>[ ] Latest version supports Jakarta EE 9+ namespace?<\/li>\n<li>[ ] Latest version supports Java 21?<\/li>\n<li>[ ] Breaking changes between your current version and the Jakarta-compatible version documented?<\/li>\n<li>[ ] Transitive dependencies also compatible? (a common trap: your library is compatible, but it pulls in an older version of something that is not)<\/li>\n<li>[ ] License unchanged in the new version?<\/li>\n<li>[ ] If no compatible version exists: is there an alternative library? Can you inline the functionality?<\/li>\n<\/ul>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Timeline and Effort Estimates&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>Based on our experience with SAP Commerce implementations of varying complexity:<\/p>\n<table>\n<thead>\n<tr>\n<th>Codebase Size<\/th>\n<th>Custom Extensions<\/th>\n<th>Estimated Effort<\/th>\n<th>Calendar Time<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Small<\/td>\n<td>&lt; 10 extensions, &lt; 50K LoC<\/td>\n<td>2-4 developer-weeks<\/td>\n<td>4-6 weeks<\/td>\n<\/tr>\n<tr>\n<td>Medium<\/td>\n<td>10-25 extensions, 50-150K LoC<\/td>\n<td>6-12 developer-weeks<\/td>\n<td>8-14 weeks<\/td>\n<\/tr>\n<tr>\n<td>Large<\/td>\n<td>25+ extensions, 150K+ LoC<\/td>\n<td>15-25 developer-weeks<\/td>\n<td>14-22 weeks<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>These estimates cover code migration, testing, and stabilization. They assume developers familiar with both SAP Commerce and modern Java\/Spring. If your team needs to learn Spring 6 and Java 21 concepts during the migration, add 30-50% for the learning curve.<\/p>\n<p><strong>Critical path items<\/strong> that often determine timeline:<\/p>\n<ol>\n<li>Third-party dependency compatibility (can be a blocker if a critical library lacks a compatible version)<\/li>\n<li>Spring Security reconfiguration (always takes longer than expected)<\/li>\n<li>Integration testing in CCv2 environments (environment availability and deployment cycle times are bottlenecks)<\/li>\n<\/ol>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Common Pitfalls&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p><strong>Pitfall 1: Bulk find-and-replace without verification.<\/strong> Replacing <code>javax<\/code> with <code>jakarta<\/code> globally will break JDK classes. Always use targeted replacements for specific Jakarta EE packages only.<\/p>\n<p><strong>Pitfall 2: Ignoring transitive dependencies.<\/strong> Your code compiles, but a library pulls in an old <code>javax.servlet-api<\/code> JAR that conflicts at runtime. Use dependency analysis tools (<code>gradle dependencies<\/code> or <code>mvn dependency:tree<\/code>) to find and exclude conflicting transitives.<\/p>\n<p><strong>Pitfall 3: Skipping the Spring Security migration.<\/strong> &#8220;We&#8217;ll do it later.&#8221; Spring Security changes are deeply integrated with the platform&#8217;s authentication and authorization. Postponing this creates a ticking time bomb.<\/p>\n<p><strong>Pitfall 4: Not testing with production-like data.<\/strong> The migration may work perfectly with a test dataset and fail with production data volumes. Particularly relevant for JPA\/Hibernate changes where query behavior can differ subtly.<\/p>\n<p><strong>Pitfall 5: Underestimating SAP-specific customization points.<\/strong> SAP Commerce has its own patterns for filters, interceptors, and event handlers that layer on top of Spring. These need individual attention &#8211; they do not automatically migrate with generic Spring migration recipes.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Closing Notes&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>The Spring 6 and Java 21 migration for SAP Commerce is substantial but manageable. It is primarily a mechanical exercise (namespace changes, API updates) combined with targeted architectural work (Spring Security, build configuration). The code changes are well-understood, and the ecosystem provides good tooling for most of the heavy lifting.<\/p>\n<p>The key is to approach it methodically: dependencies first, then namespace migration, then Spring-specific changes, then thorough testing at every layer. Resist the temptation to combine this migration with feature work or other architectural changes. Do one thing at a time, and do it well.<\/p>\n<p>If your team needs guidance on planning or executing this migration, our <a href=\"https:\/\/commerce-consulting-services.com\/en\/it-consulting-services\/sap-commerce-consulting\/\">SAP Commerce consulting services<\/a> include technical architecture support for exactly this type of platform evolution. With over 12 years of SAP Commerce experience, we can help you navigate the migration efficiently and avoid the pitfalls that cost other teams weeks of rework.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Hero&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; custom_padding=&#8221;0vw||80px||false|false&#8221; locked=&#8221;off&#8221; collapsed=&#8221;on&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_row _builder_version=&#8221;4.18.0&#8243; _module_preset=&#8221;5138c454-be54-4233-bd3b-f8e6a8747976&#8243; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.18.0&#8243; _module_preset=&#8221;73121f80-a3ef-4484-8763-c3f18e3c56d2&#8243; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;SAP Commerce&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;f0c675ea-2574-4d0e-b725-30f8550a8550&#8243; title_level=&#8221;h4&#8243; title_font=&#8221;IBM Plex Sans|IBM Plex Sans Condensed_weight||on|||||&#8221; title_text_color=&#8221;#1d3557&#8243; title_font_size=&#8221;14px&#8221; title_letter_spacing=&#8221;1px&#8221; title_line_height=&#8221;1.4em&#8221; custom_margin=&#8221;||10px||false|false&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{%22#1d3557%22:%91%22title_text_color%22%93}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_heading title=&#8221;Spring Framework 6 and Java 21 Migration for SAP Commerce Cloud&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;ddeb8c09-9078-4424-bc15-2efb6572e28e&#8221; title_font=&#8221;IBM Plex Sans Condensed|IBM [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2352,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[47],"tags":[],"class_list":["post-2353","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sap-commerce"],"acf":{"cta_title":"Need SAP Commerce expertise?","cta_description":"12+ years of enterprise e-commerce consulting. Architecture reviews, migrations, performance optimization.","cta_button_text":"Schedule a Consultation","cta_button_url":"https:\/\/commerce-consulting-services.com\/en\/contact-it-consultant\/"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/posts\/2353","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/comments?post=2353"}],"version-history":[{"count":2,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/posts\/2353\/revisions"}],"predecessor-version":[{"id":2417,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/posts\/2353\/revisions\/2417"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/media\/2352"}],"wp:attachment":[{"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/media?parent=2353"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/categories?post=2353"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/tags?post=2353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}