Oracle Web Services On Demand Guide > Best Practices for Designing Client Application > Best Practices for Integration Design >

Avoiding Proxy Class Compilation Failure Due to the Java 64KB Limit


The Java language enforces a size limit on member functions, which cannot exceed the size of 64KB (see http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#9279).

As part of the process of generating proxy classes from the Oracle CRM On Demand WSDL files, the serializer and deserializer methods that are generated can exceed 64KB in size. Therefore, a process like the following can result in a compilation error:

  1. Generate proxy classes using Oracle JDeveloper 11g or any other Java integrated development environment (IDE).
  2. Compile the proxy classes.

    An out of memory error message is thrown due to the 64KB limit on member functions. For example, the error message for Oracle JDeveloper 11g is:

    code segment of method doDeserialize(oracle.j2ee.ws.common.streaming.XMLReader, oracle.j2ee.ws.common.encoding.SOAPDeserializationContext) too large

This occurs for any Java compiler depending on the number of fields that are generated in the doSerialize or doDeserialize methods, as the 64KB limit is a Java VM limitation.

There are two possible workarounds:

  • Split the doSerialize method.

    You can split the doDeserialize () and doSerialize () methods into multiple smaller methods to bypass the 64KB limit. The sample code snippets in Figure 2 and Figure 3 illustrate the splitting of the doSerialize method.

    TIP:   This is the recommended approach, as it is more consistent and is a more generic solution that can be implemented across all client integrations.

  • Delete unused fields generated in the serialize methods.

    You can trim the doSerialize method by deleting unused fields, which is specific to each client integration.

Figure 2. A doSerialize() Method Before Splitting:

public void doSerialize(java.lang.Object obj, XMLWriter writer, SOAPSerializationContext context) throws Exception

{

// @GeneratedBlockBegin (value={"oracle.j2ee.ws"} );

activity.proxy.types.crmondemand.xml.activity.data.ActivityData instance = (activity.proxy.types.crmondemand.xml.activity.data.ActivityData)obj;

      

   if (instance.getModifiedDate() != null) {

      myns3_dateTime__java_util_Calendar_DateTimeCalendar_Serializer.setNullable( false );

      myns3_dateTime__java_util_Calendar_DateTimeCalendar_Serializer.serialize(instance.getModifiedDate(),

      ns2_ModifiedDate_QNAME, null, writer, context);

   }

   if (instance.getCreatedDate() != null) {

      myns3_dateTime__java_util_Calendar_DateTimeCalendar_Serializer.setNullable( false );

      myns3_dateTime__java_util_Calendar_DateTimeCalendar_Serializer.serialize(instance.getCreatedDate(),

      ns2_CreatedDate_QNAME, null, writer, context);

      }

   if (instance.getModifiedById() != null) {

      myns3_string__java_lang_String_String_Serializer.setNullable( false );

      myns3_string__java_lang_String_String_Serializer.serialize(instance.getModifiedById(),

      ns2_ModifiedById_QNAME, null, writer, context);

      }

   if (instance.getCreatedById() != null) {

      myns3_string__java_lang_String_String_Serializer.setNullable( false );

      myns3_string__java_lang_String_String_Serializer.serialize(instance.getCreatedById(),

      ns2_CreatedById_QNAME, null, writer, context);

      }

   if (instance.getModId() != null) {

      myns3__int__java_lang_Integer_Int_Serializer.setNullable( false );

      myns3__int__java_lang_Integer_Int_Serializer.serialize(instance.getModId(),

      ns2_ModId_QNAME, null, writer, context);

   }

...

}

Figure 3. A doSerialize() Method After Splitting

public void doSerialize(java.lang.Object obj, XMLWriter writer, SOAPSerializationContext context) throws Exception

{

   // @GeneratedBlockBegin (value={"oracle.j2ee.ws"} );

   activity.proxy.types.crmondemand.xml.activity.data.ActivityData instance =    (activity.proxy.types.crmondemand.xml.activity.data.ActivityData)obj;

   instance = doSerialize1(instance, writer, context);

   instance = doSerialize2(instance, writer, context);

   ...

   }

public activity.proxy.types.crmondemand.xml.activity.data.ActivityData doSerialize1(activity.proxy.types.crmondemand.xml.activity.data.ActivityData instance, XMLWriter writer, SOAPSerializationContext context) throws Exception

{

   if (instance.getModifiedDate() != null) {

      myns3_dateTime__java_util_Calendar_DateTimeCalendar_Serializer.setNullable( false );

      myns3_dateTime__java_util_Calendar_DateTimeCalendar_Serializer.serialize(instance.getModifiedDate(),

      ns2_ModifiedDate_QNAME, null, writer, context);

   }

   if (instance.getCreatedDate() != null) {

      myns3_dateTime__java_util_Calendar_DateTimeCalendar_Serializer.setNullable( false );

      myns3_dateTime__java_util_Calendar_DateTimeCalendar_Serializer.serialize(instance.getCreatedDate(),

      ns2_CreatedDate_QNAME, null, writer, context);

   }

...

return instance;

   }

public activity.proxy.types.crmondemand.xml.activity.data.ActivityData doSerialize2(activity.proxy.types.crmondemand.xml.activity.data.ActivityData instance, XMLWriter writer, SOAPSerializationContext context) throws Exception

{

   if (instance.getModifiedById() != null)

      {

      myns3_string__java_lang_String_String_Serializer.setNullable( false );

      myns3_string__java_lang_String_String_Serializer.serialize(instance.getModifiedById(),

      ns2_ModifiedById_QNAME, null, writer, context);

   }

   if (instance.getCreatedById() != null) {

      myns3_string__java_lang_String_String_Serializer.setNullable( false );

      myns3_string__java_lang_String_String_Serializer.serialize(instance.getCreatedById(),

      ns2_CreatedById_QNAME, null, writer, context);

   }

   if (instance.getModId() != null) {

      myns3__int__java_lang_Integer_Int_Serializer.setNullable( false );

      myns3__int__java_lang_Integer_Int_Serializer.serialize(instance.getModId(),

      ns2_ModId_QNAME, null, writer, context);

   }

   ...

return instance;

}

Oracle Web Services On Demand Guide, Version 25.0 (Oracle CRM On Demand Release 37) Copyright © 2018, Oracle and/or its affiliates. All rights reserved. Legal Notices.