杰克逊的映射器抛出了相互矛盾的setter定义"在三星SM-T580上

时间:2016-12-09 15:20:52

标签: java android json jackson

问题:将JSON转换为带有Jackson的对象时,我的Samsung SM-T580(Android 6.0.1)会抛出以下异常。仅在Samsung SM-T580上,OnePlus3(Android 6.0.1)或ZenPad 8.0(Android 5)不会引发异常。

java.lang.IllegalArgumentException: Conflicting setter definitions for property "myanmarEncoding": android.graphics.Paint#setMyanmarEncoding(1 params) vs android.graphics.Paint#setMyanmarEncoding(1 params)
           at [Source: N/A; line: -1, column: -1]

映射的执行方式如下(Jackson版本2.8.4)。

import com.fasterxml.jackson.databind.ObjectMapper;
...
ObjectMapper objectMapper = new ObjectMapper();
try {
    myObj = objectMapper.convertValue(document.getProperties(), MyClass.class);
} catch (Exception e) {
    Log.e(TAG, e.getLocalizedMessage());
    return;
}

方法:首先,我已将@JsonIgnoreProperties(ignoreUnknown = true)添加到MyClass。然后,我尝试通过混合使用@JsonIgnoreTypeandroid.graphics.Paint来解决此问题。 这有点成功,因为它阻止了第一个例外。

不幸的是,抛出了另一个异常:

java.lang.IllegalArgumentException: Conflicting setter definitions for property "content": android.widget.HoverPopupWindow#setContent(1 params) vs android.widget.HoverPopupWindow#setContent(1 params)
           at [Source: N/A; line: -1, column: -1]

方法android.graphics.Paint#setMyanmarEncoding和类android.widget.HoverPopupWindow似乎是隐藏的Android源代码的一部分。

这里发生了什么,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

通过排除Paint.class并忽略Android隐藏setContent中的HoverPopupWindow.class方法,我找到了解决方法。相关的方法参数在HoverPopupWindow.smali(GitHub)中定义。

这是mixins的应用方式(在使用objectMapper.convertValue之前):

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(android.graphics.Paint.class, IgnoreType.class);
objectMapper.addMixIn(Object.class, IgnoreMethods.class);

mixin类的定义如下:

@JsonIgnoreType
public class IgnoreType {}

interface IgnoreMethods {
    @JsonIgnore
    void setContent(int resId);

    @JsonIgnore
    void setContent(View view);

    @JsonIgnore
    void setContent(View view, ViewGroup.LayoutParams lp);

    @JsonIgnore
    void setContent(CharSequence text);
}

不幸的是,我仍然不知道为什么映射器会尝试在此特定设备上实例化PaintHoverPopupView类。