Package upgrade can fail with an unknown property which does not exist in the package
Apex , Packaging , VisualForce
Last updated 2022-02-10 ·Reference W-6281372 ·Reported By 10 users
Summary
If a package upgrade failed and if the second round of the upgrade attempt is done with a different version from the one used in the previous failed upgrade, a compile info of an apex component which has been created at the first upgrade attempt could be used while compiling apex components in the second upgrade. It could make the second upgrade attempt fail with the "Unknown property" errors. And the name of the properties in the error messages will show properties which does not exist in the package used in the second upgrade attempt.
Repro
1. Create the package of version 1.0.
1-1. On a developer org, create 2 apex classes which are used as controllers.
public class MyComponentController {
}
public class MyOuterComponentController {
}
1-2. Create 2 apex components which uses previous apex classes as controllers, and make one of them refer to another. Name them as "MyComponent" and "MyOuterComponent".
"MyComponent"
<apex:component controller="MyComponentController">
</apex:component>
"MyOuterComponent"
<apex:component controller="MyOuterComponentController">
<c:MyComponent />
</apex:component>
1-3. Create a test class for controllers.
@isTest private class TestClazz {
testmethod static void dotest() {
MyComponentController c = new MyComponentController();
MyOuterComponentController oc = new MyOuterComponentController();
}
}
1-4. Create a managed package, add them all to it, and upload it as 1.0.
2. Create the package of version 1.1.
2-1. Modify "MyOuterComponentController" and add a property.
public class MyOuterComponentController {
public String str { get; set; }
}
2-2. Modify "MyOuterComponent" so that it refers to the property previously added.
<apex:component controller="MyOuterComponentController">
<apex.outputTest value="{!str}" />
<c:MyComponent />
</apex:component>
2-3. Modify "MyComponent" so it outputs something.
<apex:component controller="MyComponentController">
This is my page. <br/>
</apex:component>
2-4. Modify the test class so that it covers the newly added code.
@isTest private class TestClazz {
testmethod static void dotest() {
MyComponentController c = new MyComponentController();
MyOuterComponentController oc = new MyOuterComponentController();
System.debug(oc.str);
}
}
2-5. Upload the package as 1.1.
3. Create the package of version 1.2.
3-1. Modify "MyComponentController" and add a new property.
public class MyComponentController {
public String aNewProperty { get; set; }
}
3-2. Modify "MyComponent" so that it refers to the property previously added.
<apex:component controller="MyComponentController">
<apex:outputPanel rendered="{!AND(aNewProperty != null)}">
This is my page.
</apex:outputPanel>
</apex:component>
3-3. Create an install handler which throws an exception so that the upgrade fails.
global class MyInstallHandler implements InstallHandler {
global void onInstall(InstallContext context) { throwException(); }
public void throwException() {
Account acc = [select name from account where name = 'NeverExists']; // it should throw an exception.
}
}
4. On a subscriber org, install the package 1.0.
5. On the subscriber org, try upgrading the package from 1.0 to 1.2. It should fail with the "The post install script failed." error, and the installed package version is still 1.0.
6. On the subscriber org, try upgrading the package from 1.0 to 1.1. You will see that the upgrade fails due to the unknown property of MyComponentController.aNewProperty which does not exist in the package 1.1, as follows:
Exception type: class core.mfpackage.install.HandledPackageInstallException
Exception msg: moduleapi.isv.packaging.exception.PackageInstallException: 00Dxx0000001gkn: Multiple install problems encountered [null: Unknown property 'MyComponentController.aNewProperty': MyOuterComponent: Unknown property 'MyComponentController.aNewProperty']
Stack trace:
core.mfpackage.install.HandledPackageInstallException: moduleapi.isv.packaging.exception.PackageInstallExcep
Workaround
Split the deployment into two:
- First deployment contains Apex classes and Visualforce pages
- Second deployment contains the Visualforce components
This issue is due to an internal bug related to cache processing.
Is it Fixed?
Any unreleased services, features, statuses, or dates referenced in this or other public statements are not currently available and may not be delivered on time or at all. Customers who purchase our services should make their purchase decisions based upon features that are currently available.