Issue Details (XML | Word | Printable)

Key: GDS-173
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Franck Wolff
Reporter: Archie Chen
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
GraniteDS

throws NoConverterFoundException when the enity use generic type

Created: 08/Aug/08 02:42 AM   Updated: 13/Aug/08 11:53 AM   Resolved: 08/Aug/08 03:48 PM
Component/s: AMF3 (de)serialization
Affects Version/s: 1.1.0_RC3
Fix Version/s: 1.1.0_RC4

File Attachments: 1. JPEG File debug.JPG (178 kB) 08/Aug/08 01:47 PM - Archie Chen

Environment: windowsXP jdk1.6.0_07 Tomcat6.0.16 spring2.5.4 hibernate3.2.6
Issue Links:
Duplicate
 


 Description  « Hide
My entities such as:

@Entity
@Table(name = "AREA_DICTIONARY")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "AREA_TYPE")
public abstract class AreaDictionary<T extends AreaDictionary> extends AbstractDictionary {

private static final long serialVersionUID = 5785254299910289021L;

private T parent;

@ManyToOne(targetEntity = AreaDictionary.class)
@JoinColumn(name = "PARENT_ID")
public T getParent() {
return parent;
}

public void setParent(T parent) {
this.parent = parent;
}

}

@SuppressWarnings("unchecked")
@Entity
@DiscriminatorValue(value = "COUNTRY")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Country extends AreaDictionary {

private static final long serialVersionUID = -4517254994340586739L;
private String code;

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

}

@Entity
@DiscriminatorValue(value = "PROVINCE")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Province extends AreaDictionary<Country> {

private static final long serialVersionUID = 2927795534905964608L;
private String code;

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}
}

@Entity
@DiscriminatorValue(value = "CITY")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class City extends AreaDictionary<Province> {

private static final long serialVersionUID = -2420747329423752178L;
private String code;

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

}

exception :

org.granite.messaging.amf.io.convert.NoConverterFoundException: Cannot convert: com.chinacache.oss.entity.dictionary.Country@22 to: T
at org.granite.messaging.amf.io.convert.Converters.getConverter(Converters.java:112)
at org.granite.messaging.amf.io.convert.Converters.convert(Converters.java:125)
at org.granite.hibernate.HibernateExternalizer.readExternal(HibernateExternalizer.java:112)
at org.granite.messaging.amf.io.AMF3Deserializer.readAMF3Object(AMF3Deserializer.java:355)
at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:118)
at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:87)
at org.granite.messaging.amf.io.AMF3Deserializer.readAMF3Array(AMF3Deserializer.java:253)
at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:116)
at org.granite.messaging.amf.io.AMF3Deserializer.readAMF3Object(AMF3Deserializer.java:380)
at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:118)
at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:87)
at org.granite.messaging.amf.io.AMF0Deserializer.readAMF3Data(AMF0Deserializer.java:324)
at org.granite.messaging.amf.io.AMF0Deserializer.readData(AMF0Deserializer.java:376)
at org.granite.messaging.amf.io.AMF0Deserializer.readArray(AMF0Deserializer.java:239)
at org.granite.messaging.amf.io.AMF0Deserializer.readData(AMF0Deserializer.java:362)
at org.granite.messaging.amf.io.AMF0Deserializer.readBodies(AMF0Deserializer.java:155)
at org.granite.messaging.amf.io.AMF0Deserializer.<init>(AMF0Deserializer.java:94)

Sort Order: Ascending order - Click to sort in descending order
Franck Wolff added a comment - 08/Aug/08 12:28 PM
Hi,

Could you debug the org.granite.messaging.amf.io.convert.impl.Compatibility.canConvert(Object value, Type targetType) method to see what's happening with your real world example?

Thanks,
Franck.

Archie Chen added a comment - 08/Aug/08 01:47 PM
it's the debug screen.

Franck Wolff added a comment - 08/Aug/08 03:04 PM
Does this code work (try a hot swap when debugging)?

    public boolean canConvert(Object value, Type targetType) {
        if (value == null)
            return !ClassUtil.isPrimitive(targetType);

//------------------------------------------------ NEW {
        if (targetType instanceof TypeVariable &&
         ((TypeVariable<?>)targetType).getGenericDeclaration() instanceof Type)
         targetType = (Type)((TypeVariable<?>)targetType).getGenericDeclaration();
//------------------------------------------------ } NEW
        
        if (targetType instanceof Class<?>)
            return ((Class<?>)targetType).isInstance(value);

        if (targetType instanceof ParameterizedType) {
            ParameterizedType pType = (ParameterizedType)targetType;
            if (((Class<?>)pType.getRawType()).isInstance(value)) {
                Type[] pTypeArgs = pType.getActualTypeArguments();
                if (pTypeArgs == null || pTypeArgs.length == 0)
                    return true;
                for (Type pTypeArg : pTypeArgs) {
                    if (!(pTypeArg instanceof WildcardType || pTypeArg.equals(Object.class)))
                        return false;
                }
                return true;
            }
        }

        return false;
    }

Thanks,
Franck.

Archie Chen added a comment - 08/Aug/08 03:32 PM
it's ok!

Thanks

Franck Wolff added a comment - 08/Aug/08 03:48 PM
Done (commited in trunk).