与SmileFactory一起使用时的AbstractMethodError?

时间:2013-12-08 20:25:01

标签: java json serialization jackson

我最近开始使用JackonSmileFactory API's来序列化JSON文档,但每当我尝试使用SmileFactory

序列化时,我都会遇到异常

下面是我的主类代码,它将使用Value类使用Jackson制作JSON文档,然后使用ObjectMapper序列化JSON,我也在这里使用SmileFactory将其序列化为二进制数据格式,但每当我尝试使用时,它总是给我异常

public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put("id", 123);
        properties.put("test", 200);
        properties.put("marks", 100);

        Value val = new Value();
        val.setProperties(properties);

        String json = new ObjectMapper().writeValueAsString(val);
        System.out.println(json);

        // this line is giving me an exception
        byte[] smileEncoded = new ObjectMapper(new SmileFactory()).writeValueAsBytes(val);
        System.out.println(smileEncoded);

}

下面是我的Value类,它使用Jackson制作JSON文档,并使用ObjectMapper来序列化文档。

@JsonPropertyOrder(value = { "v" })
public class Value {

    private Map<String, Object> properties;

    /**
     * Default constructor.
     */
    @JsonCreator
    public Value() {
        properties = new HashMap<String, Object>();
    }


    /**
     * Gets the properties of this attribute value.
     * @return the properties of this attribute value.
     */
    @JsonProperty("v")
    public Map<String, Object> getProperties() {
        return properties;
    }

    /**
     * Sets the properties of this attribute value.
     * @param v the properties of this attribute value to set
     */
    @JsonProperty("v")
    public void setProperties(Map<String, Object> v) {
        properties = v;
    }


    @Override
    public String toString() {
        try {
            return new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
        } catch (Exception e) {
            // log exception
        }

        return ToStringBuilder.reflectionToString(this);
    }    
}

以下是我得到的例外情况 -

Exception in thread "main" java.lang.AbstractMethodError: org/codehaus/jackson/JsonGenerator.writeFieldName(Ljava/lang/String;)V
    at org.codehaus.jackson.JsonGenerator.writeFieldName(JsonGenerator.java:516)
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:444)
    at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)

我有Maven依赖 -

<dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-smile</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.3</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-smile</artifactId>
            <version>1.6.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>14.0.1</version>
        </dependency>
    </dependencies>

1 个答案:

答案 0 :(得分:2)

您正在混合各种库版本。 com.fasterxml.jacksonjackson的最新版本,而org.codehaus.jackson是旧版本。

我不知道你的项目中可能有哪些其他依赖项,但你应该升级到最新版本的jackson

<!-- JSON serialization -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>${jackson.version}</version>
</dependency> 
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-smile</artifactId>
    <version>${jackson.version}</version>
</dependency>

jackson.version可以是2.1.1,就像您拥有或更高。 See here


或者,您可以将jackson-mapper-asl版本还原为1.6.0

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

1.6.0版本有一个JsonGeneratorBase类,用于实现abstract JsonGenerator#writeFieldName(String)方法。版本1.9.13没有,这就是您获得java.lang.AbstractMethodError的原因。那个错误的javadoc说明了

  

这个错误只能在运行时发生,如果定义了某个类   由于当前执行的方法是最后一个,因此已经不兼容地更改   编译。

所以你只是使用不兼容的类编译版本。

相关问题