2016-05-31 5 views
2

Я пытаюсь сериализовать Foo в String. Кажется, это довольно простая задача, но по какой-то причине DateTime, похоже, сломает ее.JsonGenerationException: Генератор CSV не поддерживает значения объектов для свойств

Test.java

import com.fasterxml.jackson.dataformat.csv.CsvMapper; 
import com.fasterxml.jackson.dataformat.csv.CsvSchema; 
import java.io.IOException; 
import java.sql.Timestamp; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import org.joda.time.DateTime; 

public class Test { 

    public static void main(String args[]) { 
     try { 
      List<Foo> foos = new ArrayList<>(); 
      Foo foo = new Foo(); 
      foo.setID(1); 
      foo.setCURRENT(new DateTime(new Timestamp(System.currentTimeMillis()))); 
      foos.add(foo); 
      String content = serialize(foos, Foo.class, Boolean.TRUE); 
      System.out.println(content); 
     } catch (IOException ex) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public static final synchronized String serialize(final Object object, final Class type, final Boolean withHeaders) throws IOException { 
     CsvMapper csvMapper = new CsvMapper(); 
     CsvSchema csvSchema; 
     if (withHeaders) { 
      csvSchema = csvMapper.schemaFor(type).withHeader(); 
     } else { 
      csvSchema = csvMapper.schemaFor(type).withoutHeader(); 
     } 
     return csvMapper.writer(csvSchema).writeValueAsString(object); 
    } 

} 

Foo.java

import org.joda.time.DateTime; 

public class Foo { 

    private Integer ID; 
    private DateTime CURRENT; 

    public Foo() { 
    } 

    public Integer getID() { 
     return ID; 
    } 

    public void setID(Integer ID) { 
     this.ID = ID; 
    } 

    public DateTime getCURRENT() { 
     return CURRENT; 
    } 

    public void setCURRENT(DateTime CURRENT) { 
     this.CURRENT = CURRENT; 
    } 

} 

Я попытался с помощью @JsonGetter и @JsonSetter в моем Foo объекта, но это действительно не имеет никакого влияния.

В чем причина этой ошибки?

ответ

1

Вы включили модуль типа данных для Joda DateTime? Тот, который вам нужен, - jackson-datatype-joda, от https://github.com/FasterXML/jackson-datatype-joda. Если нет, это объяснит проблему, поскольку значения будут рассматриваться как обычные POJO, а CSV не подходит для вложенных данных без какого-либо сопоставления в пунктирные нотации.