Buggy code:
@ ExportedBean public abstract class Node extends AbstractModelObject implements ExtensionPoint , ReconfigurableDescribable < Node > , AccessControlled { private static final Logger LOGGER = Logger . getLogger ( Node . class . getName ( ) ) ; protected transient volatile boolean holdOffLaunchUntilSave ; public String getDisplayName ( ) { } public String getSearchUrl ( ) { } public boolean isHoldOffLaunchUntilSave ( ) { } @ Exported ( visibility = 999 ) public abstract String getNodeName ( ) { } public abstract void setNodeName ( String name ) { } @ Exported public abstract String getNodeDescription ( ) { } public abstract Launcher createLauncher ( TaskListener listener ) { } @ Exported public abstract int getNumExecutors ( ) { } @ Exported public abstract Node . Mode getMode ( ) { } public final Computer toComputer ( ) { } public final VirtualChannel getChannel ( ) { } protected abstract Computer createComputer ( ) { } @ Extension public static class InternalComputerListener extends ComputerListener { @ Override public void onOnline ( Computer c , TaskListener listener ) { } } private OfflineCause temporaryOfflineCause ; void setTemporaryOfflineCause ( OfflineCause cause ) { } public TagCloud < LabelAtom > getLabelCloud ( ) { } @ Exported public Set < LabelAtom > getAssignedLabels ( ) { } private HashSet < LabelAtom > getDynamicLabels ( ) { } public abstract String getLabelString ( ) { } @ WithBridgeMethods ( Label . class ) public LabelAtom getSelfLabel ( ) { } public CauseOfBlockage canTake ( Task task ) { } public abstract FilePath getWorkspaceFor ( TopLevelItem item ) { } public abstract FilePath getRootPath ( ) { } public FilePath createPath ( String absolutePath ) { } public FileSystemProvisioner getFileSystemProvisioner ( ) { } public abstract DescribableList < NodeProperty < ? > , NodePropertyDescriptor > getNodeProperties ( ) { } public List < NodePropertyDescriptor > getNodePropertyDescriptors ( ) { } public ACL getACL ( ) { } public final void checkPermission ( Permission permission ) { } public final boolean hasPermission ( Permission permission ) { } <START_BUG> public Node reconfigure ( StaplerRequest req , JSONObject form ) throws FormException { <END_BUG> if ( form == null ) return null ; final JSONObject jsonForProperties = form . optJSONObject ( "nodeProperties" ) ; BindInterceptor old = req . setBindListener ( new BindInterceptor ( ) { @ Override public Object onConvert ( Type targetType , Class targetTypeErasure , Object jsonSource ) { if ( jsonForProperties != jsonSource ) return DEFAULT ; try { DescribableList < NodeProperty < ? > , NodePropertyDescriptor > tmp = new DescribableList < NodeProperty < ? > , NodePropertyDescriptor > ( Saveable . NOOP , getNodeProperties ( ) . toList ( ) ) ; tmp . rebuild ( req , jsonForProperties , NodeProperty . all ( ) ) ; return tmp . toList ( ) ; } catch ( FormException e ) { throw new IllegalArgumentException ( e ) ; } catch ( IOException e ) { throw new IllegalArgumentException ( e ) ; } } } ) ; try { return getDescriptor ( ) . newInstance ( req , form ) ; } finally { req . setBindListener ( old ) ; } } public abstract NodeDescriptor getDescriptor ( ) { } public abstract ClockDifference getClockDifference ( ) throws IOException , InterruptedException { } public enum Mode { NORMAL ( Messages . Node_Mode_NORMAL ( ) ) , EXCLUSIVE ( Messages . Node_Mode_EXCLUSIVE ( ) ) ; private final String description ; public String getDescription ( ) { } public String getName ( ) { } Mode ( String description ) { } } }

Fix:
public Node reconfigure ( final StaplerRequest req , JSONObject form ) throws FormException {