2013-12-08 3 views
0

Я недавно начал использовать Jackon и SmileFactory API's сериализовать документ JSON, но каким-то образом я получаю исключение каждый раз, когда я пытаюсь сериализации его с помощью SmileFactoryAbstractMethodError при использовании с SmileFactory?

Ниже мой основной код класса, который будет использовать класс Value, чтобы сделать JSON документ используя Джексон, а затем сериализации JSON с помощью ObjectMapper, а также я использую 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, который использует Джексон сделает документ 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> 
+0

Какие версии джексона вы используете? Перечислите все имеющиеся у вас Jackson libs. –

+0

Обновлен вопрос с деталями .. – AKIWEB

ответ

2

Вы смешивание всех видов версий библиотеки. com.fasterxml.jackson - это новейшая версия jackson, а org.codehaus.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 класс, который реализует метод abstractJsonGenerator#writeFieldName(String). Версия 1.9.13 нет, поэтому вы получаете java.lang.AbstractMethodError. Это Javadoc для этой ошибки заявляет

Эта ошибка может произойти только во время выполнения, если определение некоторого класса уже несовместимо изменился так как метод в настоящее время выполнения последнего компиляции.

Таким образом, вы просто используете несовместимые скомпилированные версии классов.

Смежные вопросы