Friday, September 18, 2026

SAP Commerce Solr Indexing Deep Dive: Full Index, Update, Partial Update, CronJobs & Troubleshooting

Introduction

In the previous article, we discussed how Solr provides search and faceted navigation in SAP Commerce.

Today, we will go one level deeper and understand how SAP Commerce actually puts Commerce data into the Solr index.

This is an especially important topic for senior SAP Commerce developers because many production issues are related to indexing:

Product exists in database
        ↓
Product does not appear in search

or:

Product price changed
        ↓
Database has new price
        ↓
Search still shows old price

or:

New indexed property added
        ↓
Application deployed
        ↓
Search does not return expected results

Understanding the indexing pipeline makes these problems much easier to troubleshoot.


1. What Is Solr Indexing?

Solr indexing is the process of converting SAP Commerce data into searchable Solr documents.

At a high level:

SAP Commerce
     |
     v
Product / Other Indexed Item
     |
     v
Indexer
     |
     v
Indexed Properties
     |
     v
Value Providers
     |
     v
Solr Document
     |
     v
Solr Index

For example, a Commerce product might contain:

code = IPHONE-001
name = iPhone
brand = Apple
price = 79999
color = Black

The indexing process converts the relevant information into fields that Solr can search.

Conceptually:

ProductModel
   |
   +---- code -----> Solr field
   |
   +---- name -----> Solr field
   |
   +---- brand ----> Solr field
   |
   +---- price ----> Solr field
   |
   +---- color ----> Solr field

The important point is that the Commerce database and Solr index are separate representations of the data.


2. Database vs Solr Index

This is one of the first concepts you should remember.

Commerce Database
        |
        | Source data
        v
       Indexer
        |
        v
   Solr Index

The database might contain:

Product 1001
price = 4999

while the Solr document may still contain:

price = 5499

until the appropriate indexing/update operation occurs.

Therefore:

Database data ≠ Solr data

This explains many "product exists but search is wrong" production incidents.


3. SAP Commerce Solr Indexing Components

A simplified indexing architecture looks like this:

                SAP Commerce
                     |
                     v
              Indexed Type
                     |
                     v
           Indexed Properties
                     |
                     v
             Indexer Queries
                     |
                     v
             Value Providers
                     |
                     v
              Indexer Service
                     |
                     v
                  Solr

Important concepts include:

  • Indexed Type
  • Indexed Properties
  • Indexer Queries
  • Value Providers
  • Indexer Service
  • Indexer Operations
  • CronJobs
  • Solr Index
  • Search Configuration

4. What Is an Indexed Type?

An Indexed Type identifies the type of Commerce item that should be indexed.

A common example is:

Product

For example:

Indexed Type = Product

Then you configure the properties that need to be indexed:

Product.code
Product.name
Product.description
Product.price
Product.brand
Product.color

The exact configuration depends on your Commerce version and project.


5. What Is an Indexed Property?

An Indexed Property represents an attribute that should be available in Solr.

For example:

name
brand
price
color
size
category

Each property can have a specific purpose.

For example:

name
   → searchable

brand
   → filterable/facetable

price
   → sortable/range filtering

code
   → searchable

color
   → facet

This distinction is important.

Not every property should be configured for every search capability.


6. What Is an Indexer Query?

The indexer needs to know which Commerce items it should process.

Indexer queries determine which items are selected for indexing operations.

Conceptually:

Database
    |
    v
Indexer Query
    |
    v
Products to Process

For example, an update operation may identify products that have changed since a particular point in time.

The exact query structure depends on the configured indexed type and operation.


7. What Is a Value Provider?

Sometimes the required Solr value isn't simply:

product.getCode()

The value may need to be calculated.

For example:

Product
  |
  +-- Brand
  +-- Category
  +-- Classification
  |
  v
Custom Search Text

A value provider can be used to produce the value that should be indexed.

Example concept:

public String buildSearchValue(ProductModel product)
{
    StringBuilder value = new StringBuilder();

    value.append(product.getName());

    if (product.getManufacturerName() != null)
    {
        value.append(" ");
        value.append(product.getManufacturerName());
    }

    return value.toString();
}

The actual SAP Commerce interface and implementation should follow the platform version being used.


8. Solr Index Operations

SAP Commerce supports several important indexing operations:

FULL
UPDATE
PARTIAL_UPDATE
DELETE

These operations have different purposes.


9. FULL Index

A FULL operation recreates the index from the complete configured dataset.

Conceptually:

Existing Solr Index
        |
        v
     FULL
        |
        v
Read all required Commerce items
        |
        v
Create new Solr index

SAP documentation describes FULL as recreating the index and processing all items selected by the FULL index query.

FULL indexing is commonly required when:

  • Setting up a new index
  • Major indexing configuration changes are introduced
  • New indexed properties are added
  • Large amounts of indexed data need rebuilding
  • The existing index is suspected to be stale
  • Removed database data must be reflected in the index

10. FULL Indexing Example

Suppose you have:

1,000,000 products

and add:

material

as a new indexed property.

Existing Solr documents may not contain the new field.

You may need to rebuild the index:

New Configuration
       |
       v
FULL Index
       |
       v
1,000,000 Products
       |
       v
Updated Solr Index

Running a full index on a large catalog can be expensive, so it should be planned appropriately.


11. UPDATE Operation

An UPDATE operation updates selected existing indexed items.

Conceptually:

10 products changed
       |
       v
UPDATE
       |
       v
Only relevant products processed

SAP documentation describes UPDATE as updating selected documents, normally based on an UPDATE query.

This is generally more efficient than rebuilding an entire index when only a subset of data has changed.


12. FULL vs UPDATE

A common interview question is:

What is the difference between FULL and UPDATE?

FULLUPDATE
Recreates the indexUpdates selected documents
Processes complete configured dataProcesses selected changes
More expensiveUsually less expensive
Used for rebuildingUsed for normal updates
Useful after major configuration changesUseful for changed items

A simple way to remember:

FULL   → rebuild everything
UPDATE → update selected items

13. PARTIAL_UPDATE

PARTIAL_UPDATE is different from a normal UPDATE.

With partial update, only selected fields of an existing Solr document are changed.

For example:

Product

name     = Nike Shoes
brand    = Nike
price    = 4999
stock    = 20

Only stock changes:

stock = 5

A partial update can target the required field instead of reconstructing the entire document.

SAP documents PARTIAL_UPDATE as potentially faster than a normal UPDATE because it can select the fields to change, although it has additional limitations and configuration requirements.


14. UPDATE vs PARTIAL_UPDATE

This is an excellent senior interview question.

UPDATE

Conceptually:

Product changed
     |
     v
Build updated document
     |
     v
Update Solr

PARTIAL_UPDATE

Conceptually:

Product changed
     |
     v
Only required field changes
     |
     v
Update selected Solr fields

Remember:

UPDATE
    = update document

PARTIAL_UPDATE
    = update selected document fields

15. Important PARTIAL_UPDATE Limitation

Partial updates are not automatically better in every situation.

SAP documentation lists limitations for PARTIAL_UPDATE, including requirements around stored Solr attributes and restrictions for some fields such as those used for spellchecking/suggestions. SAP also notes that continuously refreshing the index can affect search performance.

Therefore:

PARTIAL_UPDATE ≠ always use this

The correct operation depends on the type of data change and indexing architecture.


16. DELETE Operation

DELETE removes selected documents from the Solr index.

For example:

Product ABC

is no longer supposed to appear in search.

Conceptually:

Product ABC
     |
     v
DELETE
     |
     v
Removed from Solr

SAP documentation describes DELETE as removing selected documents while leaving other indexed documents available.


17. Why Can Deleted Products Remain in Solr?

Consider:

Product exists in DB

then it is deleted.

However:

Solr document still exists

This can happen if the corresponding delete/index synchronization hasn't occurred.

That's one reason SAP documentation recommends regularly using FULL indexing to ensure data removed from the database is also removed from Solr.

This can produce a classic production problem:

Product deleted from Commerce
       |
       v
Product still appears in search

18. FULL, UPDATE, PARTIAL_UPDATE and DELETE

Keep this table for interview revision:

OperationPurpose
FULLRecreate the index
UPDATEUpdate selected documents
PARTIAL_UPDATEUpdate selected fields of existing documents
DELETERemove selected documents

A simple memory trick:

FULL            → Everything
UPDATE          → Documents
PARTIAL_UPDATE  → Fields
DELETE          → Remove

19. What Is a Solr Indexer CronJob?

Indexing can be triggered through CronJobs.

SAP Commerce provides indexer CronJob types for different use cases.

SAP documentation states that SolrIndexerCronJob supports:

FULL
UPDATE
DELETE

while SolrExtIndexerCronJob supports:

UPDATE
PARTIAL_UPDATE
DELETE

with different configuration behavior.

This distinction can be useful when troubleshooting why a particular indexing operation isn't available through a given CronJob configuration.


20. Typical CronJob Flow

A simplified flow is:

CronJob
   |
   v
Indexer Job
   |
   v
Indexer Service
   |
   v
Indexer Query
   |
   v
Commerce Items
   |
   v
Solr Documents

For example:

Nightly Full Index
        |
        v
SolrIndexerCronJob
        |
        v
FULL
        |
        v
Products
        |
        v
Solr

21. When Should You Schedule Indexing?

A project might schedule indexing based on its business needs.

For example:

Nightly
    |
    +---- Full indexing

Every few minutes
    |
    +---- Incremental/Update processing

Near real time
    |
    +---- Hot/partial updates where appropriate

There is no universal schedule.

The correct strategy depends on:

  • Catalog size
  • Product update frequency
  • Search SLA
  • Infrastructure capacity
  • Business requirements
  • Number of indexed properties
  • Number of sites/catalogs

22. What Is Hot Update?

A hot update is a selective update of the Solr index for particular items.

SAP Commerce provides an Indexer Hot Update Wizard for ad-hoc updates where only one or a few indexed items need to be updated or removed.

For example:

Product 1001
Product 1002

need immediate reindexing.

Instead of rebuilding the complete catalog, a selective operation can update those items.

Conceptually:

1,000,000 products
        |
        +---- Product 1001
        +---- Product 1002
                    |
                    v
               Hot Update

23. Hot Update vs Full Index

Full Index

1,000,000 products
       |
       v
Rebuild index

Hot Update

2 products
       |
       v
Update only those products

The important point is:

Use a targeted operation when the change is targeted.

However, do not use selective updates blindly. You still need to understand why the index became inconsistent.


24. TWO_PHASE vs DIRECT FULL Indexing

For FULL indexing, SAP Commerce supports different indexing modes.

Two important modes are:

DIRECT
TWO_PHASE

SAP documentation describes DIRECT as indexing directly against the live index, while TWO_PHASE builds a temporary index and replaces the current live index after successful completion.

Conceptually:

DIRECT

Existing Live Index
        |
        v
Write changes directly

TWO_PHASE

Existing Live Index
        |
        | remains available
        |
        v

Temporary Index
        |
        v
Build complete
        |
        v
Replace Live Index

This is a useful concept for understanding large production indexing operations.


25. Why Is TWO_PHASE Important?

Imagine:

10 million products

A full indexing process can take significant time.

If users must continue searching while a new index is being built, the indexing strategy becomes very important.

A two-phase approach can build the new index separately and switch once the operation succeeds.

This is one reason senior developers should understand not just what indexing does, but how index availability is managed during indexing.


26. Production Scenario: Product Price Is Stale

Suppose:

Database:
Product ABC
Price = 4999

But search returns:

Price = 5499

How do you investigate?

Step 1: Verify Commerce data

Check the Product/Price information.

Step 2: Determine where the search response gets its price

Is it:

Solr
Commerce service
Cache

?

Step 3: Check Solr document

Verify whether Solr still contains:

5499

Step 4: Check indexing/update

Determine whether the product update triggered:

UPDATE

or an appropriate selective update.

Step 5: Check indexing errors

Review CronJob/indexer logs.

Step 6: Check caching

If Solr is correct but the API still returns the old value, continue downstream:

Solr
 ↓
Search Service
 ↓
Facade
 ↓
DTO
 ↓
Cache/API

This prevents blindly running full indexing when the real problem is elsewhere.


27. Production Scenario: Product Deleted but Still Searchable

Problem:

Product deleted from Commerce

but:

Search → Product still visible

Possible flow:

Database
    ↓
Product removed
    ↓
Delete event/index update?
    ↓
Solr

Check whether the appropriate delete/index operation occurred.

If stale documents remain, a properly planned FULL indexing operation can also reconcile the index with current database contents. SAP specifically recommends regular FULL indexing for this consistency reason.


28. Production Scenario: New Indexed Property Not Working

Suppose the business asks:

"Customers should search by material number."

You add:

materialNumber

to the indexing configuration.

But after deployment:

Search material number
       ↓
No results

Do not assume the configuration automatically populated old Solr documents.

Check:

1. Indexed Property
2. Correct Indexed Type
3. Value Provider
4. Search configuration
5. Indexing operation
6. Solr document
7. Search query

A full reindex may be required to populate the new field for existing data.


29. Production Scenario: Indexing Job Failed

Suppose a CronJob reports:

ERROR

The first mistake is to immediately rerun it.

Instead, determine:

What operation?
FULL / UPDATE / PARTIAL_UPDATE / DELETE

Then investigate:

Indexer query
Value provider
Product data
Database connectivity
Solr connectivity
Solr configuration
Memory/resource limits
Custom code

A custom value provider is a common place to investigate when a particular product consistently causes indexing failures.


30. How Custom Value Providers Can Cause Problems

Imagine:

public Object getFieldValue(ProductModel product)
{
    return someComplexService.loadData(product);
}

Now imagine:

1,000,000 products

and each product triggers several database/service calls.

You could accidentally create:

1,000,000 × expensive operation

This can make indexing extremely slow.

Therefore, custom indexing logic should be designed carefully.

Avoid unnecessary:

FlexibleSearch inside loops
Repeated database calls
Network calls
Heavy calculations

wherever possible.


31. Indexing Performance Optimization

For large catalogs, indexing performance matters.

Keep indexed data relevant

Do not index unnecessary attributes.

Keep custom providers efficient

Avoid expensive operations per product.

Avoid unnecessary FULL indexes

Use targeted update operations when appropriate.

Monitor CronJobs

Track:

Start time
End time
Status
Processed items
Errors

Review Solr configuration

Poorly designed search configuration can affect both indexing and search performance.


32. Indexing and Catalog Size

Consider two projects.

Project A

20,000 products

Project B

10,000,000 products

A strategy that works for Project A may be completely inappropriate for Project B.

For example:

Run FULL index every hour

may be acceptable in one environment and operationally expensive in another.

Therefore, indexing strategy should always consider catalog scale.


33. Indexing and Multi-Site Architecture

Many SAP Commerce projects support multiple:

Base Sites
Catalogs
Catalog Versions
Currencies
Languages

Therefore, Solr configuration needs to be considered carefully.

You may have:

Site A
   |
   +---- Catalog A
   |
   +---- Solr configuration A

Site B
   |
   +---- Catalog B
   |
   +---- Solr configuration B

A search problem may therefore exist only for one site or catalog.

When troubleshooting, always ask:

Which site?
Which catalog?
Which catalog version?
Which language?
Which currency?
Which Solr configuration?

34. Solr Indexing Troubleshooting Checklist

When search is not working, follow this sequence.

1. Does the Commerce item exist?
                ↓
2. Is it in the correct catalog/version?
                ↓
3. Is the indexed type correct?
                ↓
4. Is the property configured?
                ↓
5. Is the value provider returning a value?
                ↓
6. Did the index operation run?
                ↓
7. Did the index operation succeed?
                ↓
8. Does the Solr document contain the value?
                ↓
9. Is the search query looking at the correct field?
                ↓
10. Are restrictions/filters removing the result?
                ↓
11. Is cache returning stale data?

This is a much better debugging approach than repeatedly running a full index.


35. Useful Logs to Check

Depending on the SAP Commerce version and project logging configuration, investigate logs related to:

Solr
Indexer
Facet Search
CronJob
Search
Custom Value Provider

When investigating an error, identify:

Product PK/code
Indexed Type
Facet Search Configuration
Operation
CronJob
Exception
Root cause

These details make production troubleshooting much faster.


36. Interview Question: Explain the Complete Solr Indexing Flow

Answer

A strong senior-level answer would be:

SAP Commerce takes configured Commerce data through an indexing pipeline. The indexed type defines what is being indexed, indexed properties define the searchable/indexed attributes, and indexer queries determine the items to process. Value providers can supply or calculate values for indexed properties. The indexer service then creates or updates Solr documents using operations such as FULL, UPDATE, PARTIAL_UPDATE, and DELETE. The resulting Solr index is later queried by the Commerce search layer and exposed through the storefront or OCC APIs.


37. Interview Question: FULL vs UPDATE?

Answer

FULL rebuilds the complete index based on the FULL index query.

UPDATE updates selected indexed documents.

Use FULL when rebuilding or reconciling a complete index is required.

Use UPDATE when only selected items have changed.


38. Interview Question: UPDATE vs PARTIAL_UPDATE?

Answer

UPDATE updates selected indexed documents.

PARTIAL_UPDATE can update selected fields of an existing document.

Therefore:

UPDATE
→ document-level update

PARTIAL_UPDATE
→ field-level update

Partial updates can be faster for appropriate use cases, but they have additional limitations and should be used according to the project's indexing design.


39. Interview Question: Why Is My Product in FlexibleSearch but Not Solr?

Answer

I would investigate the complete pipeline:

Product
 ↓
Catalog
 ↓
Indexed Type
 ↓
Indexed Property
 ↓
Indexer Query
 ↓
Value Provider
 ↓
Indexer
 ↓
Solr Document
 ↓
Search Query

I would also check:

Indexing CronJob
Indexing errors
Product status
Catalog version
Search configuration
Restrictions
Solr document

This demonstrates actual production troubleshooting rather than assuming FlexibleSearch and Solr behave the same way.


40. Interview Question: Should You Run FULL Index Every Time a Product Changes?

Answer

No.

Running a full index for every product change can be unnecessarily expensive, especially with a large catalog.

Depending on the architecture, selective UPDATE, PARTIAL_UPDATE, hot updates, or another synchronization mechanism may be more appropriate.

The correct approach depends on:

Catalog size
Update frequency
Search SLA
Infrastructure
Business requirements

41. Interview Question: What Happens During FULL Indexing?

Answer

At a high level:

FULL operation
      |
      v
Select complete configured dataset
      |
      v
Build Solr documents
      |
      v
Write index
      |
      v
Make index available according to the configured indexing mode

SAP Commerce supports DIRECT and TWO_PHASE modes for FULL operations.


42. Interview Question: What Is a Hot Update?

Answer

A hot update is a selective Solr update for a limited number of items rather than rebuilding the complete index.

It is useful for ad-hoc or targeted corrections where only a few indexed items need to be updated or deleted. SAP Commerce provides a Hot Update Wizard for this purpose.


43. Senior-Level Production Question

Question

A business user changes a product in Backoffice and immediately sees the new data in one environment, but another environment continues showing the old search result.

How would you investigate?

Answer

I would compare the indexing architecture between environments.

Check:

1. Solr configuration
2. Indexing mode
3. Hot update configuration
4. Background/async indexing
5. CronJob schedules
6. Indexing failures
7. Solr connectivity
8. Cache
9. Catalog/version
10. Search configuration

I would also check whether the second environment is intentionally using asynchronous indexing.

SAP's Backoffice documentation notes that background Solr indexing can make updates asynchronous, meaning search results may not immediately reflect the latest data while the background operation is still running.


44. Real Production Debugging Flow

When a search issue reaches production, use:

                   Search Issue
                       |
                       v
              Check API response
                       |
                       v
              Check search service
                       |
                       v
                 Check Solr
                       |
              +--------+--------+
              |                 |
           Correct            Wrong
              |                 |
              v                 v
        Check API/cache    Check index
                                |
                                v
                         Check indexing job
                                |
                                v
                         Check Commerce data
                                |
                                v
                          Fix + reindex

This approach helps isolate whether the problem is:

Data problem
Indexing problem
Solr problem
Search configuration problem
API problem
Caching problem

45. Most Important Concepts to Remember

For interviews, remember these seven concepts:

1. Indexed Type
2. Indexed Property
3. Indexer Query
4. Value Provider
5. Indexing Operation
6. Solr Document
7. Search Query

And these four operations:

FULL
UPDATE
PARTIAL_UPDATE
DELETE

And these two important FULL modes:

DIRECT
TWO_PHASE

46. Quick Revision Diagram

                         SAP Commerce
                              |
                              v
                       Product / Data
                              |
                              v
                       Indexed Type
                              |
                              v
                     Indexed Properties
                              |
                              v
                      Indexer Queries
                              |
                              v
                       Value Providers
                              |
                              v
                       Indexer Service
                              |
             +----------------+----------------+
             |                |                |
             v                v                v
           FULL             UPDATE       PARTIAL_UPDATE
             |                |                |
             +----------------+----------------+
                              |
                              v
                         Solr Index
                              |
                              v
                      Search Service
                              |
             +----------------+----------------+
             |                |                |
             v                v                v
          Results           Facets           Sorting
             |
             v
          OCC / Storefront

47. Final Takeaway

SAP Commerce Solr indexing is much more than simply "running a Solr index."

A senior developer should understand the complete lifecycle:

Commerce Data
      ↓
Indexed Type
      ↓
Indexed Properties
      ↓
Indexer Queries
      ↓
Value Providers
      ↓
Indexing Operation
      ↓
Solr Document
      ↓
Search
      ↓
OCC / Storefront

The four operations are:

FULL
UPDATE
PARTIAL_UPDATE
DELETE

Use them based on the actual requirement rather than automatically choosing FULL indexing.

Most importantly, when a product exists in Commerce but search is incorrect, remember:

Database ≠ Solr Index

Troubleshoot the complete pipeline before deciding where the problem exists.

Friday, September 11, 2026

SAP Commerce Solr Search Explained: Indexing, Facets, Filters, Search & Performance

Introduction

Search is one of the most important features in an e-commerce application.

Imagine an online store containing hundreds of thousands or millions of products. When a customer searches for:

Nike Running Shoes

the application needs to quickly return relevant products and allow the customer to narrow the results using filters such as:

  • Brand
  • Category
  • Size
  • Color
  • Price
  • Availability
  • Rating

Executing a complex database query for every customer search can become expensive.

This is where Apache Solr comes into the SAP Commerce architecture.

SAP Commerce uses the solrfacetsearch functionality to provide search and faceted navigation over indexed Commerce data. SAP documentation describes it as supporting faceted search over items such as products and WCMS content.

In this article, we will understand Solr from both a developer and SAP Commerce interview perspective.


1. What Is Solr?

Apache Solr is a search platform designed for fast searching and indexing of large amounts of data.

Instead of searching the Commerce database directly for every customer request, SAP Commerce can index relevant product information into Solr.

Conceptually:

SAP Commerce Database
        |
        | Indexing
        v
      Solr
        |
        | Search
        v
Customer Search Request

For example, your database may contain:

Product
---------------------------------
code
name
description
price
brand
category
color
size
stock

During indexing, selected information is transformed into a Solr document.

Conceptually:

{
  "code": "NIKE-001",
  "name": "Nike Running Shoes",
  "brand": "Nike",
  "category": "Running Shoes",
  "color": "Black",
  "price": 5999
}

The important point is that not every database attribute automatically becomes searchable.

The attributes that should be indexed have to be configured as indexed properties.


2. Solr in SAP Commerce Architecture

A simplified architecture looks like this:

                Customer
                   |
                   v
             Storefront/OCC
                   |
                   v
             Search Service
                   |
                   v
              Solr Server
                   |
          +--------+--------+
          |                 |
          v                 v
    Search Results       Facets
          |
          v
      Product PKs
          |
          v
     SAP Commerce
       Product

The major components include:

  • SAP Commerce
  • solrfacetsearch
  • Solr server
  • Indexed Types
  • Indexed Properties
  • Search configuration
  • Indexer
  • Search services
  • Facet configuration

SAP's documentation separates search configuration, indexed types, indexed properties, and server configuration as core parts of the Search and Navigation functionality.


3. Why Does SAP Commerce Need Solr?

Consider a catalog containing:

2,000,000 Products

A customer enters:

laptop

and expects results within a fraction of a second.

A database query may have to perform complex operations involving:

Product
Category
Price
Inventory
Brand
Classification
Language
Catalog Version

and potentially large text-search operations.

Solr is optimized specifically for search workloads.

The advantages include:

Fast text search

Search terms can be matched across indexed fields efficiently.

Full-text search

For example:

running shoes

can search relevant product text.

Fuzzy search

A misspelled term such as:

nik

can potentially return:

Nike

depending on the configured query behavior.

Faceted search

Customers can narrow results by:

Brand
Color
Size
Price Range
Category

Sorting

Results can be sorted by:

Price
Name
Relevance
Rating
Stock

4. What Is Solr Indexing?

Indexing is the process of taking data from SAP Commerce and creating searchable Solr documents.

For example:

ProductModel
     |
     v
Indexer
     |
     v
Value Providers / Resolvers
     |
     v
Solr Document
     |
     v
Solr Index

Suppose we have:

ProductModel product

with:

code = IPHONE-001
name = iPhone 17
price = 79999
brand = Apple

The indexing process converts relevant information into Solr fields.

Conceptually:

ProductModel
      |
      +---- code ------> code_string
      |
      +---- name ------> name_text
      |
      +---- price -----> price_double
      |
      +---- brand -----> brand_string

5. What Is an Indexed Type?

An Indexed Type defines what type of Commerce data is going to be indexed.

A common example is:

Product

The Indexed Type identifies the Commerce item being indexed and is associated with indexer/search configuration.

You can think of it as:

Indexed Type
      |
      +---- Product
      |
      +---- Indexed Properties
      |
      +---- Indexer Configuration
      |
      +---- Search Configuration

6. What Are Indexed Properties?

An Indexed Property represents a property of the indexed type that should be available in Solr.

For example:

Product.code
Product.name
Product.description
Product.price
Product.brand
Product.color

The property configuration determines how the value should be indexed and potentially searched, filtered, faceted, or returned.

SAP Commerce documentation provides different configurations for strings, dates, numbers, enums, localized values and other types.


7. Example of an Indexed Property

A simplified ImpEx-style example might look like:

INSERT_UPDATE SolrIndexedProperty;
name[unique=true];
solrIndexedType(identifier)[unique=true];
type(code);
localized[default=false];
facet[default=false]

;name;Product;TEXT;true;false
;code;Product;TEXT;false;false
;brand;Product;STRING;false;true
;price;Product;DOUBLE;false;true

The exact configuration can vary by SAP Commerce version and project.

The important concept is:

Commerce Attribute
        |
        v
SolrIndexedProperty
        |
        v
Solr Field

8. Text vs String in Solr

This is an important interview topic.

Suppose you have:

Product Name = Nike Running Shoes

If you want full-text search behavior, the property typically needs to be configured appropriately as a text-search field.

For example:

name → text

A string field behaves differently from a text field because text processing/analyzers can be applied to searchable text.

SAP's documentation specifically notes that string indexing can behave differently with filters and may result in case-sensitive searching compared with appropriately configured text fields.


9. Free-Text Search

Free-text search allows users to enter search terms without explicitly specifying a field.

Example:

red nike shoes

The search engine attempts to identify matching indexed content.

Typical searchable properties might include:

name
description
code
brand
category

SAP Commerce search property configuration supports different query behaviors, including free-text, fuzzy, wildcard, and phrase queries.


10. Fuzzy Search

Customers frequently make spelling mistakes.

For example:

runing shoes

instead of:

running shoes

Fuzzy search can help identify terms that are similar.

Conceptually:

runing
  |
  v
running

This can improve the customer's search experience.

However, fuzzy searching should be used carefully because aggressive fuzzy queries can increase search cost and return less precise results.


11. Wildcard Search

Wildcard search allows partial matching.

Example:

nik*

could potentially match:

nike
nikon

Depending on the configured search behavior.

Wildcard queries should be used carefully, especially with leading wildcards such as:

*shoe

because they can be expensive depending on the Solr/query configuration.


12. Phrase Search

Suppose the customer enters:

running shoes

A phrase-oriented search can treat the complete phrase as a meaningful sequence rather than simply searching the individual words independently.

This can improve relevance for certain use cases.


13. What Are Facets?

Facets are filters that allow customers to narrow search results.

Suppose a customer searches:

shoes

The application might display:

Brand
----------------
Nike (120)
Adidas (90)
Puma (50)

Color
----------------
Black (100)
White (75)
Red (40)

Price
----------------
₹0 - ₹2,000
₹2,000 - ₹5,000
₹5,000+

These are facets.

The customer can select:

Brand = Nike
Color = Black

and the results become narrower.

SAP Commerce's search configuration supports facet settings on indexed properties.


14. Facet Example

Consider:

Product
-------------------
Brand
Color
Size
Price
Category

Configure:

brand → facet
color → facet
size → facet
price → facet/range

Then the search UI could display:

Brand

Nike       120
Adidas      90
Puma        50

and:

Color

Black      100
White       80
Blue        40

15. Range Facets

Some values are better represented as ranges.

Price is the most common example.

Instead of:

₹1499
₹1699
₹1899
₹1999
₹2499

the customer can see:

₹0 - ₹2,000
₹2,000 - ₹5,000
₹5,000 - ₹10,000
₹10,000+

These are range facets.

They are especially useful for:

  • Price
  • Age
  • Weight
  • Rating
  • Size
  • Numeric attributes

16. Full Index vs Incremental/Partial Updates

This is one of the most important Solr interview questions.

Full Index

A full index rebuild processes the complete dataset configured for the index.

Conceptually:

All Products
     |
     v
Indexer
     |
     v
New Solr Index

Full indexing may be used after:

  • major configuration changes
  • new indexed properties
  • catalog changes
  • initial setup
  • index corruption
  • significant data/configuration changes

Partial or Incremental Update

A partial update updates only the required information rather than rebuilding an entire document.

For example:

Product 1001

Old:
price = 5000
stock = 20

New:
stock = 5

Instead of rebuilding everything, the update process can target the necessary change.

SAP documents partial updates as a way to update a subset of Solr document attributes rather than rebuilding the entire document, which is useful for large catalogs.


17. When Should You Run a Full Index?

A common scenario:

You add a new indexed property:

material

The existing Solr index doesn't automatically contain the new field for every existing product simply because you changed the configuration.

A full indexing operation is commonly required so the existing dataset gets indexed according to the new configuration.

Typical flow:

Change Indexed Property
          |
          v
Update Configuration
          |
          v
Run Full Index
          |
          v
Validate Search

18. Solr Indexer CronJob

SAP Commerce provides indexing functionality that can be executed through CronJobs.

For example:

System
  |
  +-- Background Processes
        |
        +-- CronJobs
              |
              +-- Solr Indexer

You can configure execution schedules and indexing operations through the administration tooling. SAP documentation also describes configuring Solr index update CronJobs and their operation settings.


19. Why Is My Product Available in the Database but Not in Search?

This is one of the most common production issues.

You execute:

SELECT * FROM Product

and find:

Product exists

but searching through storefront/OCC doesn't return it.

Do not immediately assume FlexibleSearch is the problem.

The product may not be correctly represented in the Solr index.

Check:

1. Product exists
2. Correct catalog
3. Correct catalog version
4. Product is indexed
5. Indexed property configuration
6. Indexing job status
7. Solr configuration
8. Query configuration
9. Search restrictions
10. Facet/search configuration

20. Troubleshooting: Product Not Showing in Solr

A practical troubleshooting sequence is:

Step 1: Check the Product

Verify:

code
catalog
catalogVersion
approvalStatus
onlineDate
offlineDate

Step 2: Check Indexed Type

Confirm that the relevant product type is included in the indexed type configuration.


Step 3: Check Indexed Properties

If you're searching:

brand = Nike

verify that:

brand

is configured as an indexed property.


Step 4: Check Indexing Job

Look for indexing errors in:

Backoffice
HAC
logs
CronJobs

Step 5: Run a Full Index

When configuration changes or stale index data is suspected, run the appropriate full indexing operation.


Step 6: Validate Solr

Confirm that the expected Solr document exists and contains the expected fields.


21. Database Data vs Solr Data

A very important concept:

Database ≠ Solr Index

The database contains the source Commerce data.

Solr contains the indexed/search-oriented representation.

Therefore:

Product exists in DB

does not necessarily mean:

Product exists correctly in Solr

This distinction is extremely important when debugging production search problems.


22. What Is a Value Provider?

During indexing, SAP Commerce needs to determine where an indexed value comes from.

For example:

Product.price

may be directly available from the Product model.

But a complex property could require custom logic.

Conceptually:

ProductModel
     |
     v
Value Provider
     |
     v
Solr Field

A custom value provider may be appropriate when the indexed value must be calculated or assembled from multiple sources.

For example:

Product
  |
  +-- Brand
  +-- Category
  +-- Classification
  |
  v
Custom Calculated Search Value

23. Example Custom Value Provider Concept

Suppose the business wants a searchable field:

searchKeywords

generated from:

product name
brand
category
classification

A custom provider could conceptually do:

public class CustomSearchValueProvider
{
    public Object getFieldValue(ProductModel product)
    {
        StringBuilder value = new StringBuilder();

        value.append(product.getName());

        if (product.getManufacturerName() != null)
        {
            value.append(" ");
            value.append(product.getManufacturerName());
        }

        return value.toString();
    }
}

The exact SAP Commerce interface and method signature depend on the platform/version and project setup, so the implementation should follow the corresponding version's Solr indexing API.


24. Localized Indexed Properties

E-commerce applications are often multilingual.

For example:

English:
Running Shoes

German:
Laufschuhe

French:
Chaussures de course

Product names can therefore require localized indexing.

The indexing configuration needs to account for localization.

This is especially important when troubleshooting a problem such as:

Search works in English
Search fails in German

Check whether the property is configured correctly as localized and whether the required language data was indexed.

SAP's Solr property configuration explicitly supports localized properties.


25. Currency-Dependent Properties

Price is another special case.

Consider:

India   → INR 79,999
USA     → USD 999
Europe  → EUR 949

Search/index configuration needs to account for currency where relevant.

A price field should not simply be treated like an ordinary string.

This is why SAP Commerce Solr indexed properties support currency-specific configuration.


26. Search Restrictions and Solr

Another tricky area is Search Restrictions.

A product may exist in the Solr index, but additional Commerce-side restrictions can still affect what a particular user sees.

This can produce confusing behavior such as:

Solr contains product
        +
Search restriction applies
        =
Product not visible to user

SAP documentation also notes that search restrictions can affect Solr result counts in some situations.


27. Solr and OCC

In a headless SAP Commerce implementation, OCC APIs may expose search functionality.

A conceptual request might look like:

GET /occ/v2/{baseSiteId}/products/search?query=shoes

The flow can be represented as:

Mobile/Web Client
       |
       v
OCC Controller
       |
       v
Facade
       |
       v
Search Service
       |
       v
Solr
       |
       v
Search Results
       |
       v
Product Data / DTO

This is an important connection between your OCC knowledge and Solr knowledge.


28. Pagination in Solr Search

Suppose there are:

50,000 products

The API should not return all of them.

Instead:

Page 0
size = 20

returns:

Products 1 - 20

and:

Page 1
size = 20

returns:

Products 21 - 40

Pagination helps reduce:

  • response size
  • network traffic
  • memory usage
  • rendering time

29. Sorting Search Results

Customers may want:

Relevance
Price Low → High
Price High → Low
Newest
Name

Solr can support configured sorting behavior.

For example:

search=shoes
sort=price-asc

The exact OCC query parameters depend on your API/version/customization, but the important architectural concept is:

Customer Sort Selection
        |
        v
Search Query
        |
        v
Solr Sorting

30. Solr Performance Optimization

Solr performance becomes increasingly important as catalog size grows.

1. Index only required data

Do not blindly index every Product attribute.

More indexed data can mean:

larger index
more storage
more processing
more indexing time

SAP also recommends avoiding sensitive/confidential data in Solr indexing because indexed data can introduce information disclosure risks.


2. Avoid unnecessary facets

Do not make every property a facet.

For example, these may not make sense as customer-facing facets:

internalCreationTimestamp
internalERPFlag
internalProcessingStatus

Use facets where customers actually need filtering.


3. Optimize indexed properties

Only index fields that have a business/search purpose.

Ask:

Do customers search this?
Do customers filter by this?
Does sorting need this?
Does the response require this?

If the answer is no, reconsider indexing it.


4. Use pagination

Avoid returning huge result sets.

Prefer:

pageSize = 20

or another business-appropriate value instead of thousands of results.


5. Avoid unnecessary full indexing

For a large catalog:

Full Index

can be expensive.

Use the appropriate update strategy for smaller changes where supported.

SAP documents partial updates specifically as a way to avoid rebuilding complete documents for small changes.


31. A Common Production Scenario

Imagine you receive this incident:

"Customer updated the product price, but the storefront still shows the old price."

The database shows:

Product Price = ₹4,999

But storefront shows:

₹5,499

What do you check?

Step 1

Verify the database:

Product price = ₹4,999

Step 2

Check whether the price is Solr-driven for the particular storefront/search response.

Step 3

Check the relevant Solr document.

Step 4

Check the indexing/update process.

Step 5

Check whether the update job executed successfully.

Step 6

Check whether a cache is contributing to the stale result.

Step 7

If necessary, trigger the appropriate index update/full index according to the project's configuration.

The important debugging principle is:

Database
   ↓
Indexing
   ↓
Solr
   ↓
Search Service
   ↓
Cache/API
   ↓
Storefront

Find where the stale value first appears.


32. Another Real-World Scenario

Problem

The product exists in Backoffice.

FlexibleSearch returns it.

But:

/search?query=ABC

returns no result.

Investigation

Check:

Product
   ↓
Catalog Version
   ↓
Indexed Type
   ↓
Indexed Property
   ↓
Solr Index
   ↓
Search Query

Possible root causes:

Product wasn't indexed

or:

Product property isn't indexed

or:

Index is stale

or:

Search configuration doesn't use that property

or:

Search restriction/filter removes it

This type of scenario is excellent for senior SAP Commerce interviews.


33. Full Index vs Partial Update — Interview Answer

Question

What is the difference between full indexing and partial indexing/update in SAP Commerce?

Answer

Full indexing processes the complete set of configured data and creates/updates the Solr index according to the indexing configuration.

Partial updates can update only selected portions of an existing Solr document, avoiding unnecessary processing for unchanged attributes.

Use full indexing for major configuration/data changes, while partial updates can be useful for targeted changes in large catalogs.

SAP specifically documents partial updates as a way to update only a subset of document attributes.


34. Interview Question: Why Is Solr Faster Than Database Search?

Answer

Solr is specifically designed and optimized for search workloads.

It provides capabilities such as:

Inverted indexing
Full-text search
Faceting
Relevance
Fuzzy matching
Sorting
Filtering

A relational database can certainly perform search operations, but Solr is purpose-built for large-scale search and navigation use cases.


35. Interview Question: Product Exists in DB but Not in Solr. Why?

Strong Senior-Level Answer

I would check the complete indexing pipeline:

Product data
→ Indexed Type
→ Indexed Properties
→ Value Providers
→ Indexer
→ Solr document
→ Search query

Then I would check:

Catalog Version
Approval Status
Online/Offline Dates
Indexing CronJob
Indexer logs
Solr configuration
Search configuration
Search restrictions

I would also compare the Commerce database representation with the actual Solr document rather than assuming the database is the source of the search response.


36. Interview Question: What Is a Facet?

Answer

A facet is a search-navigation mechanism that allows users to filter search results based on indexed properties.

For example:

Search: Shoes

Brand:
Nike
Adidas

Color:
Black
White

Price:
₹0-₹2,000
₹2,000-₹5,000

Facets improve product discovery and allow customers to progressively narrow search results.


37. Interview Question: Why Would You Avoid Making Every Property a Facet?

Answer

Because unnecessary facets increase search complexity and can increase index/query overhead.

I would create facets only for business-relevant customer filtering requirements.

For example:

brand → Yes
color → Yes
size → Yes
internalERPCode → No
internalProcessingFlag → No

38. Interview Question: What Happens When You Add a New Indexed Property?

A good answer is:

1. Define the indexed property
2. Configure its type
3. Configure its provider/resolver if needed
4. Update search configuration if needed
5. Build/deploy changes
6. Reindex existing data
7. Validate the Solr document
8. Test search/OCC/storefront

The exact deployment/reindex procedure depends on the Commerce version and project architecture.


39. Interview Question: How Do You Troubleshoot Solr Issues?

My preferred troubleshooting flow is:

                    Issue
                      |
                      v
               Is product in DB?
                 /         \
               No           Yes
               |             |
        Fix source data   Is it indexed?
                            /      \
                          No        Yes
                          |          |
                     Check index   Check query
                     process       config
                                   |
                                   v
                         Check restrictions
                                   |
                                   v
                            Check response
                                   |
                                   v
                               Cache/API

This avoids randomly triggering full indexes without understanding the problem.


40. Important Solr Best Practices

Keep these principles in mind when working on SAP Commerce projects:

Do not index everything.

Index only what is required.

Do not make everything a facet.

Create meaningful customer-facing filters.

Understand the difference between DB and Solr.

They are different representations of the data.

Always check indexing after configuration changes.

A configuration change doesn't automatically guarantee that all existing Solr documents reflect the new structure.

Monitor indexing jobs.

An apparently successful deployment can still have failed indexing.

Be careful with custom value providers.

Poorly designed providers can make indexing expensive.

Avoid sensitive information in Solr.

SAP explicitly warns against indexing confidential data because it can create information disclosure risks.


41. SAP Commerce Solr Architecture — Quick Revision

Remember this flow:

                 SAP Commerce
                      |
                      v
                Product Data
                      |
                      v
                  Indexer
                      |
          +-----------+-----------+
          |                       |
          v                       v
 Indexed Properties          Value Providers
          |                       |
          +-----------+-----------+
                      |
                      v
                 Solr Index
                      |
                      v
                Search Query
                      |
        +-------------+-------------+
        |             |             |
        v             v             v
     Results        Facets        Sorting
        |
        v
      OCC / Storefront

This diagram is worth remembering for SAP Commerce interviews.


42. Key Terms You Should Know

TermMeaning
SolrSearch platform
Indexed TypeType of Commerce data being indexed
Indexed PropertyAttribute indexed in Solr
IndexerProcess that creates/updates index data
FacetCustomer-facing search filter
Value ProviderProvides/calculates indexed values
Full IndexIndexes the complete configured dataset
Partial UpdateUpdates part of an existing Solr document
Free-Text SearchSearch using general text terms
Fuzzy SearchSearch tolerant of spelling differences
Range FacetFacet based on numeric ranges
Search ConfigurationConfiguration controlling search behavior
Search RestrictionRestriction affecting what data a user can access

43. Final Takeaway

Solr is a fundamental part of SAP Commerce search architecture.

The most important relationship to remember is:

Commerce Database
       ↓
   Indexer
       ↓
Indexed Properties
       ↓
    Solr Index
       ↓
 Search Query
       ↓
Results + Facets
       ↓
OCC / Storefront

When debugging search issues, don't stop at FlexibleSearch.

A product can exist correctly in the Commerce database and still be missing or incorrect in Solr.

For senior SAP Commerce developers, understanding indexing, indexed properties, value providers, facets, search configuration, full vs partial updates, search restrictions, and Solr troubleshooting is essential.

Thursday, September 3, 2026

SAP Commerce OCC Error Handling: Exception Handling, Error DTOs, HTTP Status Codes & Global Error Handling

Introduction

A REST API is not complete simply because it returns a successful response.

A production-ready API must also handle failures in a predictable and meaningful way.

Consider a SAP Commerce OCC API:

GET /occ/v2/electronics/customproducts/P999

What should happen when product P999 doesn't exist?

Should the API return:

500 Internal Server Error

Probably not.

A better response would indicate that the requested resource could not be found.

Similarly, if a customer sends invalid data, the API should return a client-side error rather than a generic server exception.

This is why OCC error handling is an important part of SAP Commerce development.

In this article, we'll cover:

  • SAP Commerce OCC exception handling
  • Common exceptions
  • HTTP status codes
  • Error DTOs
  • Validation errors
  • Global error handling
  • Custom exceptions
  • Authentication and authorization errors
  • Postman testing
  • Troubleshooting strategies
  • Interview questions
  • Enterprise best practices

What is OCC Error Handling?

OCC error handling is the mechanism used by SAP Commerce to convert application exceptions into structured HTTP responses.

A simplified flow is:

Client
  ↓
OCC Controller
  ↓
Facade
  ↓
Service
  ↓
DAO
  ↓
Exception
  ↓
OCC Error Handling
  ↓
HTTP Error Response
  ↓
Client

Instead of exposing internal Java stack traces, the API should return a controlled response.

For example:

{
  "errors": [
    {
      "type": "UnknownIdentifierError",
      "message": "Product not found"
    }
  ]
}

The exact response fields depend on the SAP Commerce version and configured OCC error-handling implementation.


Why Error Handling Matters

Good error handling provides:

  • Consistent API responses
  • Easier client-side handling
  • Better debugging
  • Improved security
  • Better user experience
  • Clearer monitoring
  • Easier integration testing

Poor error handling can expose internal implementation details and make production troubleshooting much harder.


Common HTTP Status Codes

A well-designed API uses appropriate HTTP status codes.

StatusMeaningTypical OCC Scenario
200OKSuccessful GET
201CreatedSuccessful resource creation
204No ContentSuccessful operation with no response body
400Bad RequestInvalid request
401UnauthorizedAuthentication missing/invalid
403ForbiddenInsufficient permissions
404Not FoundResource doesn't exist
409ConflictBusiness/data conflict
500Internal Server ErrorUnexpected server failure

200 OK

A successful GET commonly returns:

200 OK

Example:

GET /occ/v2/electronics/products/P100

Response:

{
  "code": "P100",
  "name": "Laptop"
}

201 Created

A successful create operation can return:

201 Created

For example:

POST /occ/v2/electronics/users

after successfully creating a customer.


204 No Content

Some successful operations don't need to return a response body.

For example:

DELETE /resource/123

could return:

204 No Content

depending on the endpoint implementation.


400 Bad Request

A 400 indicates that the client sent an invalid request.

Examples:

Missing required field
Invalid JSON
Invalid parameter
Invalid value
Malformed request

Example:

{
  "email": "invalid-email"
}

if the endpoint requires a valid email address.


401 Unauthorized

A 401 generally indicates an authentication problem.

Typical causes:

  • Missing access token
  • Expired token
  • Invalid token
  • Invalid authentication configuration

Example:

GET /occ/v2/electronics/users/current/orders

without a valid access token.


403 Forbidden

A 403 generally means that authentication succeeded but authorization failed.

For example:

Authenticated customer
      ↓
Attempts admin-only API
      ↓
403 Forbidden

Remember:

401 = Authentication problem
403 = Authorization problem

This is one of the most common OCC interview questions.


404 Not Found

Use 404 when the requested resource doesn't exist.

For example:

GET /occ/v2/electronics/products/UNKNOWN

If no product exists for that code, the API should return an appropriate not-found response.


409 Conflict

409 Conflict can be useful when the request conflicts with the current state of a resource.

Examples include:

  • Duplicate business identifier
  • Invalid state transition
  • Resource already exists
  • Concurrent update conflict

Whether a particular OCC endpoint uses 409 depends on its implementation and error mapping.


500 Internal Server Error

A 500 should generally indicate an unexpected server-side failure.

Examples:

  • Unhandled exception
  • Database failure
  • External service failure
  • Programming error

Do not intentionally return 500 for normal validation or not-found conditions.


Common SAP Commerce Exceptions

During OCC execution, various SAP Commerce exceptions may occur.

Common examples include:

UnknownIdentifierException
ModelNotFoundException
InterceptorException
ValidationException
IllegalArgumentException
CommerceCartModificationException

The exact exceptions depend on the service being called.


UnknownIdentifierException

Suppose an API retrieves a product by code:

ProductModel product =
        productService.getProductForCode(code);

If the product cannot be found, the service layer can throw an appropriate identifier-related exception.

Conceptually:

if (product == null)
{
    throw new UnknownIdentifierException(
        "Product not found: " + code);
}

The OCC layer can then translate this into an appropriate REST error response.


ModelNotFoundException

This exception can occur when a requested model cannot be found in situations where the underlying API expects it to exist.

For example:

Order
Customer
Product
Cart

When exposing these resources through OCC, the exception should be transformed into a client-friendly response rather than leaking internal details.


ValidationException

Validation exceptions can occur when request data or model data fails validation.

For example:

Email missing
Invalid date
Missing mandatory field
Invalid business value

A good API should communicate clearly which input caused the failure.


InterceptorException

SAP Commerce interceptors can reject model operations.

For example:

PrepareInterceptor
ValidateInterceptor
RemoveInterceptor

Suppose an attribute is mandatory:

externalId

and the model is saved without it.

A validation or interceptor-related exception may be raised.

That exception should be handled appropriately at the application boundary.


OCC Error Response

A typical structured error response can look like:

{
  "errors": [
    {
      "type": "UnknownIdentifierError",
      "message": "Product P999 was not found"
    }
  ]
}

Depending on the version and configuration, an OCC error response can contain additional information such as:

type
message
reason
subject
subjectType
language

The exact schema should be verified against the OCC version used by the project.


Why Should We Return Structured Errors?

Imagine your frontend receives:

500 Internal Server Error

with no useful information.

The developer has no idea what happened.

Compare that with:

{
  "errors": [
    {
      "type": "UnknownIdentifierError",
      "message": "Product P999 was not found"
    }
  ]
}

Now the client can handle the error appropriately.


Exception Mapping

The OCC layer maps Java exceptions to HTTP errors.

Conceptually:

UnknownIdentifierException
        ↓
404
        ↓
UnknownIdentifierError

Another example:

AuthenticationException
        ↓
401

and:

AccessDeniedException
        ↓
403

The exact mappings depend on the configured SAP Commerce security and exception-handling infrastructure.


Error Handling in Controller

Avoid putting large amounts of exception-handling logic into every controller.

For example, don't repeat this everywhere:

try
{
    // business logic
}
catch (Exception e)
{
    // manually construct response
}

A centralized exception-handling mechanism is generally easier to maintain.


Global Exception Handling

A global exception handler can provide a central place to handle errors.

In Spring-based applications, concepts such as:

@ControllerAdvice

and:

@ExceptionHandler

are commonly used for centralized MVC exception handling.

A simplified example:

@ControllerAdvice
public class GlobalExceptionHandler
{
    @ExceptionHandler(
        UnknownIdentifierException.class)
    public ResponseEntity<?> handleNotFound(
            UnknownIdentifierException exception)
    {
        // Build appropriate response
        return ResponseEntity.notFound().build();
    }
}

However, in SAP Commerce OCC projects, you should first understand and use the platform's existing OCC exception-handling mechanisms rather than introducing a parallel error framework unnecessarily.


Custom OCC Exceptions

Sometimes a business requirement needs a specific error.

For example:

Cannot cancel an already shipped order

Instead of returning:

500

you can define appropriate business exception handling.

Conceptually:

throw new InvalidOrderStateException(
    "Order cannot be cancelled after shipment");

The OCC layer can then translate the exception into a structured error response.


Example: Cancel Order

Suppose:

Order status = SHIPPED

and the customer tries:

POST /orders/123/cancel

The service checks:

if (OrderStatus.SHIPPED.equals(order.getStatus()))
{
    throw new InvalidOrderStateException(
        "Shipped orders cannot be cancelled");
}

The API should return a meaningful client-facing error rather than a generic 500.


Validation Errors

Suppose we have:

{
  "firstName": "",
  "email": "abc"
}

If the endpoint requires:

firstName → mandatory
email → valid format

the API should identify the invalid fields.

Conceptually:

{
  "errors": [
    {
      "type": "ValidationError",
      "message": "First name is required",
      "subject": "firstName"
    },
    {
      "type": "ValidationError",
      "message": "Invalid email address",
      "subject": "email"
    }
  ]
}

The exact representation depends on the project's OCC validation configuration.


Don't Expose Stack Traces

Never return:

{
  "stackTrace": "java.lang.NullPointerException..."
}

to a customer or external client.

Stack traces can reveal:

  • Internal class names
  • File paths
  • Database details
  • Infrastructure details
  • Security-sensitive information

Log diagnostic information internally and return a controlled API response.


Logging Errors

A useful production log should capture:

Request ID
Endpoint
HTTP method
User/client
Exception type
Error message
Timestamp
Correlation ID

Example:

RequestId=REQ-10001
Endpoint=/occ/v2/electronics/products/P999
Exception=UnknownIdentifierException
Product=P999

Do not log:

Passwords
OAuth tokens
Client secrets
Sensitive customer information

Error Handling with Postman

Postman is useful for validating OCC error behaviour.

Test 1: Invalid Product

Request:

GET /occ/v2/electronics/products/P999

Expected:

404 Not Found

Test 2: No Authentication

Request:

GET /occ/v2/electronics/users/current/orders

without a token.

Expected:

401 Unauthorized

Test 3: Insufficient Permission

Use a valid authenticated user without the required permission.

Expected:

403 Forbidden

Test 4: Invalid Request

Send incomplete request data.

Expected:

400 Bad Request

Error Handling in CI/CD

Automated API tests should validate both:

Success scenarios
Failure scenarios

For example:

Product exists → 200
Product missing → 404
Invalid request → 400
Missing token → 401
Insufficient permission → 403

This prevents accidental changes to your API contract.


Error Handling Test Matrix

ScenarioExpected Status
Valid product200
Product not found404
Invalid request400
Missing token401
Invalid permissions403
Successful create201
Successful delete204
Unexpected server failure500

This table can become a useful regression checklist.


Common Mistakes

Returning 500 for Everything

Bad:

Product not found → 500
Invalid input → 500
Unauthorized → 500

This makes the API difficult to consume.


Catching Exception Too Broadly

Avoid:

catch (Exception e)
{
    throw new RuntimeException();
}

This can hide the actual business error.


Swallowing Exceptions

Avoid:

try
{
    // operation
}
catch (Exception e)
{
    // do nothing
}

Failures must be logged and handled appropriately.


Exposing Internal Messages

Avoid returning:

SQL Exception
Database table doesn't exist
NullPointerException

directly to API consumers.


Best Practices

Use Meaningful HTTP Status Codes

Don't use 500 for client errors.

Keep Error Responses Consistent

Clients should receive a predictable structure.

Centralize Common Error Handling

Use the platform's OCC mechanisms and Spring error-handling facilities appropriately.

Log Internally

Capture detailed diagnostics in server logs.

Protect Sensitive Information

Never expose credentials, tokens or internal infrastructure details.

Test Failure Scenarios

Negative scenarios are just as important as happy-path scenarios.


Enterprise Example

Imagine a checkout API:

POST /occ/v2/electronics/users/current/carts/123/payment

Possible outcomes:

Valid payment
        ↓
200 / 201

Invalid payment data
        ↓
400

Not authenticated
        ↓
401

Not authorized
        ↓
403

Cart doesn't exist
        ↓
404

Payment state conflict
        ↓
409

Payment service failure
        ↓
500

This makes the API predictable for the storefront or mobile application.


Interview Questions

What is OCC error handling?

It is the mechanism that converts backend exceptions into appropriate HTTP responses and structured OCC error information.


What is the difference between 400 and 500?

400 generally indicates that the request from the client is invalid, while 500 indicates an unexpected server-side failure.


What is the difference between 401 and 403?

401 indicates an authentication problem. 403 means the caller is authenticated but does not have sufficient permission.


What should happen when a product doesn't exist?

The API should normally return a not-found response such as:

404 Not Found

with an appropriate structured error.


Should stack traces be returned to API clients?

No. Detailed stack traces should remain on the server side.


Where should business validation occur?

Business validation generally belongs in the appropriate Service Layer/domain logic, while request-shape validation can happen at the API boundary.


Should every controller have its own try-catch?

No. Centralized exception handling is generally easier to maintain. Use SAP Commerce's existing OCC exception-handling facilities where applicable.


Real Interview Scenario

Question

Your custom OCC API returns 500 when a product code doesn't exist. How would you fix it?

Answer

I would first inspect the service and DAO flow.

Controller
   ↓
Facade
   ↓
Service
   ↓
DAO

Then determine how the missing product is represented.

Instead of allowing a generic exception or null-pointer failure to reach the web layer, the service should use an appropriate identifier-related exception.

The OCC error-handling mechanism can then map that exception to a suitable 404 response and structured error payload.

I would also add an automated regression test for the missing-product scenario.


Another Interview Scenario

Question

The API returns 401 even though Postman has a token.

What would you investigate?

Answer

I would check:

Token expiration
Token format
Authorization header
Bearer prefix
OAuth client
Scope/roles
Endpoint security configuration
Environment-specific OAuth configuration
Clock differences

Another Interview Scenario

Question

The API returns 403 after a successful login.

What does that tell you?

Answer

Authentication likely succeeded, but authorization failed.

I would investigate:

Client roles
User roles
Endpoint restrictions
Spring Security configuration
Required OCC role

Complete Error-Handling Architecture

Remember this flow:

                         CLIENT
                            |
                            ↓
                     OCC Controller
                            |
                            ↓
                         Facade
                            |
                            ↓
                         Service
                            |
                            ↓
                          DAO
                            |
                            ↓
                       Exception
                            |
                            ↓
                 OCC Error Handling
                            |
              ┌─────────────┼──────────────┐
              ↓             ↓              ↓
             400           404             500
         Bad Request    Not Found     Server Error
              |
              ↓
        Structured Error
              |
              ↓
            CLIENT

For security-related failures:

Authentication Failure → 401
Authorization Failure  → 403

Conclusion

Good error handling is a critical part of a production-ready SAP Commerce OCC API.

The most important principles are:

Correct Exception
       ↓
Correct HTTP Status
       ↓
Structured Error Response
       ↓
Useful Server Logging
       ↓
Secure Client Response

In this article, we covered:

  • OCC exception handling
  • HTTP status codes
  • 400, 401, 403, 404, 409, and 500
  • Common SAP Commerce exceptions
  • Validation errors
  • Global exception handling
  • Custom business exceptions
  • Postman testing
  • CI/CD validation
  • Security considerations
  • Production troubleshooting
  • Interview scenarios

The goal is not simply to prevent an exception from crashing an API. The goal is to make the API predictable, secure, debuggable, and easy for client applications to consume.