Open
Description
It looks like there was a change for 3.3.0 that causes marshaling frameworks like Jackson to fail to marshall objects that MyBatis creates that contain proxies for lazy loading to throw exceptions.
Here is the stack trace I am getting from Jackson:
java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: com.inversoft.cleanspeak.domain.system.User_$$_jvst80c_2["applications"]->java.util.HashSet[0]->com.inversoft.cleanspeak.domain.system.Application_$$_jvst80c_4["moderationConfiguration"]->com.inversoft.cleanspeak.domain.system.ModerationConfiguration_$$_jvst80c_5["handler"])
at com.inversoft.json.ToString.toString(ToString.java:58)
at com.inversoft.cleanspeak.domain.system.User.toString(User.java:208)
at com.inversoft.cleanspeak.domain.system.User_$$_jvst80c_2._d15toString(User_$$_jvst80c_2.java)
at org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl.invoke(JavassistProxyFactory.java:161)
at com.inversoft.cleanspeak.domain.system.User_$$_jvst80c_2.toString(User_$$_jvst80c_2.java)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.inversoft.cleanspeak.api.service.user.DefaultUserServiceTest.search(DefaultUserServiceTest.java:178)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: com.inversoft.cleanspeak.domain.system.User_$$_jvst80c_2["applications"]->java.util.HashSet[0]->com.inversoft.cleanspeak.domain.system.Application_$$_jvst80c_4["moderationConfiguration"]->com.inversoft.cleanspeak.domain.system.ModerationConfiguration_$$_jvst80c_5["handler"])
at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:59)
at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:26)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:505)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:639)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:505)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:639)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:117)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:23)
at com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:183)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:505)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:639)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:114)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2866)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2323)
at com.inversoft.json.ToString.toString(ToString.java:56)
... 36 more
... Removed 29 stack frames
I've tested with 3.2.7 and this doesn't occur. I can probably tweak my Jackson configuration to prevent this stack trace, but it would be nice to figure out what MyBatis and Javassist are generating that is causing the issue and fix that.
Activity
harawata commentedon Apr 9, 2016
I could be wrong, but this seems to be an issue between Jackson and Javassist.
http://stackoverflow.com/questions/4362104/strange-jackson-exception-being-thrown-when-serializing-hibernate-object
The default proxy factory in 3.2.7 is CGLIB.
Did you configure to use Javassist when you tested?
voidmain commentedon Apr 12, 2016
I assumed that MyBatis was in control of the method names inside the Javassist proxy. If that isn't the case, then this is indeed a Javassist/Jackson issue. Also, I didn't configure Javassist in 3.2.7, so it was likely using CGLIB.
kazuki43zoo commentedon Nov 23, 2016
Hi @voidmain , Could you try again using 3.4.2-SNAPSHOT ? And If possible, please provide a repro project via GitHub.
wuwen5 commentedon Jan 10, 2017
@harawata @kazuki43zoo I reproduce this issue. I think we should solve the problem in mybatis.
wuwen5 commentedon Jan 10, 2017
If add a getter method in
EnhancedResultObjectProxyImpl
is can be solve this problem. But maybe it's not a good idea.7 remaining items