Skip to content

Javassist proxies cause marshaling frameworks (like Jackson) to fail #570

Open
@voidmain

Description

@voidmain

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

added this to the 3.4.0 milestone on Feb 5, 2016
self-assigned this
on Feb 5, 2016
harawata

harawata commented on Apr 9, 2016

@harawata
Member

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

I've tested with 3.2.7 and this doesn't occur.

The default proxy factory in 3.2.7 is CGLIB.
Did you configure to use Javassist when you tested?

voidmain

voidmain commented on Apr 12, 2016

@voidmain
Author

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.

modified the milestones: 3.4.1, 3.4.0 on Apr 19, 2016
removed this from the 3.4.1 milestone on May 17, 2016
kazuki43zoo

kazuki43zoo commented on Nov 23, 2016

@kazuki43zoo
Member

Hi @voidmain , Could you try again using 3.4.2-SNAPSHOT ? And If possible, please provide a repro project via GitHub.

wuwen5

wuwen5 commented on Jan 10, 2017

@wuwen5
Contributor

@harawata @kazuki43zoo I reproduce this issue. I think we should solve the problem in mybatis.

wuwen5

wuwen5 commented on Jan 10, 2017

@wuwen5
Contributor

If add a getter method in EnhancedResultObjectProxyImpl is can be solve this problem. But maybe it's not a good idea.

7 remaining items

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    Javassist proxies cause marshaling frameworks (like Jackson) to fail · Issue #570 · mybatis/mybatis-3