IBM already provides a set of steps to accomplish the migration. We have experimented more than once their exactitud and in this post we are happy to share our hints and best practices can- in some way- help you out to face this critical task. What is reported in this article is the result of what we have done for a real migration.


  • Best case: WCS on version 7 FEP8 or version 8
  • If you are on version 7 <FEP8, the suggestion is to migrate to FEP8 and than to version 9
  • You don’t need to migrate also EJBs and Transactional server customizations: good news is, they can work as they are (but, to take some of the advantages of the version 9, you should think about their migration to JPA and xC).

The migration plan

In a nutshell, the plan is the following (development oriented):

  1. Migrate the security easy – well documented
  2. Migrate the configuration files medium – it can create doubts about the proper way to do it
  3. Migrate the Store web project medium –  it is error prone task since manual changes are needed
  4. Migrate Management Center complex – for the same nature of CMC
  5. Migrate the Physical Service Data Object easy – well documented
  6. Migrate the Extension Logic and custom projects easy – well documented
  7. (Optional) Migrate to xC and JPA complex – for the impact and the same customization complexity
For an average WCS platform (+7 FEP8) the migration of the toolkit (and so the code) can be considered a few weeks task.

Below we provide details of specific subtask which are not so evident in the Knowledge Center. In particular our attention will be focused on “Migrate the Store web project” and “Migrate Management Center”.

Migrate the Store web project

All services use HTTPS

<FrontEndAssetStore>/Common/EnvironmentSetup.jspf must use just


instead of


Use fn:trim () function within the <c:if test> JSP tags

The V9 logic tries to convert the string to a number before it compares them. The fn:trim () function converts strings to numbers before they are compared.

must use fn:trim () .


<c:if test="${childWidget.slot.internalSlotId == fn:trim(slotNumber) && !foundCurrentSlot}">

instead of

<c:if test="${childWidget.slot.internalSlotId == slotNumber && !foundCurrentSlot}">

 Update the CommonJSToInclude.jspf with additional java script

<FrontEndAssetStore>/Common/CommonJSToInclude.jspf must have the following code

<script type="text/javascript">
    //Redirect to HTTPS request in the browser when detect that using HTTP request,
    //since HTTP request is no longer supported in v9.
    var httpsProtocol = "https:";
    var securedPort = '<c:out value="${configValueMap[\'WebServer/SSLPort\']}"/>';
    if (window.location.protocol != httpsProtocol){
    var href = httpsProtocol + window.location.href.substring(window.location.protocol.length);
    var host =;
    var hostname = window.location.hostname;
    var httpsHost = httpsHost = (securedPort != "" && securedPort != null) ? hostname + ":" + securedPort : hostname;
    href = href.replace(host, httpsHost);
    window.location.href = href;

appended just after

<link rel="apple-touch-icon-precomposed" href="${jspStoreImgDir}images/touch-icon-152px.png" sizes="152x152"/>

Migrate struts

Struts need to be migrated to the version 2. Despite an automatic tool is provided (, this task needs also manual changes like adding the following code to the migrated version of struts-wcs-stores-marketing-services.xml

<action class="" name="CustomerSegmentUBXIntegrate">
            <param name="authenticate">0:0</param>
            <param name="https">0:1</param>
<param name="parameter"></param>
<action class="" name="ScheduledCustomerSegmentImport">
            <param name="authenticate">0:0</param>
            <param name="https">0:1</param>

Migrate the Management Center

The migration of CMC is pretty straight. In fact, it did not change at all on version 9. However, for the same nature of CMC the troubleshooting can be really hard and time consuming.

Coding suggestions to keep into account

V8 v9
Remove any use of this class
ServerJDBCHelperAccessBean jdbcAccessBean = 
   new ServerJDBCHelperAccessBean();
results = jdbcAccessBean.executeQuery(query);
To execute SQL queries, remove this piece of code and use the next instruction instead:

results = 
ServerJDBCHelperAccessBean jdbcAccessBean = 
   new ServerJDBCHelperAccessBean();
To execute update queries, remove this piece of code and use the next instruction instead

ServerJDBCHelperAccessBean sjdbcHelperAB = 
   new ServerJDBCHelperAccessBean();
records = sjdbcHelperAB.executeParameterizedQueryNoCache( 
  MERCHCONFINFO_ALL, new Object[]{ "recurringMerchantCode" } );
To execute executeParameterizedQueryNoCache method, remove this piece of code and use the next instruction instead:

  MERCHCONFINFO_ALL, new Object[]{ "recurringMerchantCode" } );
results = jdbcAccessBean.executeParameterizedQuery
  (queryValue, parameters);
To execute executeParameterizedQuery method, remove this piece of code and use the next instruction instead

results = SessionBeanHelper.lookupSessionBean(ServerJDBCHelperBean.class).
  executeParameterizedQuery(queryValue, parameters );
remove refreshCopyHelper from the code, no need to explicitly use EntityManager to make the changed JPA entity persistent. Once the transaction commit or flush operation is called, the changed data will be committed to the database. (see the reference).
remove refreshCopyHelper from the code
replace any occurrence of String “InEJBType()” by “InEntityType()” (updating all AccessBeans getters suffix)
Enumeration sds = ShippingModeCache.findByStoreEntity(
ShippingModeAccessBean has been extended to take advantage of the WebSphere Commerce data cache. Therefore use the following code

Enumeration sds = new ShippingModeAccessBean().findByStoreEntity(
addSitemaps method of the implementation SitemapGenerateCmdImpl.addSitemaps method has been renamed to zipSiteMapFiles.

and much more ….

Do not get stuck on older versions, migrate to version 9

We can help you out to lead the migration, create the new infrastructure, design the proper strategy, plan the cutover, execute it!

Do not hesitate to contact us.

Would you like to have a demo?

6 + 14 =