Menu

#22 ReflectionHelper does not handle Enum Types

open
nobody
Bug (29)
5
2007-07-16
2007-07-16
Anonymous
No

If a serialized JSON stream has an enum type, the deserializer fails. Enums do not have a null constructor so the ReflectionHelper at line 343 fails.

net.sf.sojo.core.ConversionException: Can't create a Bean from class: class com.domain.entity.AddressType
at net.sf.sojo.core.conversion.IterateableMap2BeanConversion.convert(IterateableMap2BeanConversion.java:67)
at net.sf.sojo.core.Converter.convertInternal(Converter.java:183)
at net.sf.sojo.core.Converter$InternalRecursiveConverterExtension.convert(Converter.java:241)
at net.sf.sojo.core.conversion.IterateableMap2BeanConversion.doConvert(IterateableMap2BeanConversion.java:95)
at net.sf.sojo.core.ConversionIterator.iterate(ConversionIterator.java:115)
at net.sf.sojo.core.conversion.IterateableMap2BeanConversion.convert(IterateableMap2BeanConversion.java:77)
at net.sf.sojo.core.Converter.convertInternal(Converter.java:183)
...

Discussion

  • Mario Linke

    Mario Linke - 2007-07-17

    Logged In: YES
    user_id=1287898
    Originator: NO

    Hi,

    two problems:

    1. SOJO convert only JavaBeans. This means, bean must have a constructor with out parameters.
    2. SOJO support jdk 1.4. SOJO don't know Enums (Java 5)

    Regards
    Mario

     
  • Nobody/Anonymous

    Logged In: NO

    I updated the code to support enums. I don't know the sojo source very well so it may be a bit of a hack. If anyone is interested I can submit a patch.

     
  • Nobody/Anonymous

    ### Eclipse Workspace Patch 1.0
    #P sojo
    Index: src/main/java/net/sf/sojo/core/reflect/ReflectionHelper.java
    ===================================================================
    --- src/main/java/net/sf/sojo/core/reflect/ReflectionHelper.java (revision 242)
    +++ src/main/java/net/sf/sojo/core/reflect/ReflectionHelper.java (working copy)
    @@ -353,7 +353,11 @@

    Object lvBeanObject = null;
    try {
    - lvBeanObject = lvBeanType.newInstance();
    + if (lvBeanType.isEnum()) {
    + lvBeanObject = Enum.valueOf(lvBeanType, (String) pvMap.get("name"));
    + } else {
    + lvBeanObject = lvBeanType.newInstance();
    + }
    } catch (InstantiationException e) {
    throw new InstantiationException("Can't create a Bean from class: " + lvBeanType);
    } catch (IllegalAccessException e) {
    Index: src/main/java/net/sf/sojo/core/conversion/ComplexBean2MapConversion.java
    ===================================================================
    --- src/main/java/net/sf/sojo/core/conversion/ComplexBean2MapConversion.java (revision 242)
    +++ src/main/java/net/sf/sojo/core/conversion/ComplexBean2MapConversion.java (working copy)
    @@ -79,8 +79,11 @@
    String lvUniqueId = pvConverter.getUniqueId(pvObject);
    lvBeanMap.put(UniqueIdGenerator.UNIQUE_ID_PROPERTY, lvUniqueId);
    }
    -

    + if (pvObject instanceof Enum) {
    + lvBeanMap.put("name", ((Enum)pvObject).name());
    + }
    +
    Iterator it = lvGetterMap.entrySet().iterator();
    lvBeanMap = (Map) super.iterate(pvObject, lvBeanMap, it, pvConverter);
    } catch (Exception e) {

     

Log in to post a comment.