gpt4 book ai didi

java - 与 SmileFactory 一起使用时出现 AbstractMethodError?

转载 作者:行者123 更新时间:2023-12-02 06:26:36 27 4
gpt4 key购买 nike

我最近开始使用 JackonSmileFactory API's 来序列化 JSON 文档,但不知何故,每当我尝试使用 SmileFactory< 序列化它时,我都会遇到异常

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

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>

最佳答案

您正在混合各种库版本。 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 指出

this error can only occur at run time if the definition of some class has incompatibly changed since the currently executing method was last compiled.

因此,您只是使用了不兼容的类编译版本。

关于java - 与 SmileFactory 一起使用时出现 AbstractMethodError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20458605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com