2016-04-01 2 views
2

Я пытаюсь маршал Object в csv String. Я создал метод, который может преобразовать любой объект в CSV String, но я получаю исключение:Маршал Объект CSV

java.lang.NoSuchMethodError: org.codehaus.jackson.map.ObjectMapper.writer(Lorg/codehaus/jackson/FormatSchema;)Lorg/codehaus/jackson/map/ObjectWriter; 

метод Маршал:

public static final synchronized String marshal(final Object object, final CsvSchema csvSchema) throws IOException { 
     String CSV_FILTER_NAME = "csvFilter"; 
     HashSet<String> columnNames = new HashSet<>(); 
     for (CsvSchema.Column column : csvSchema) { 
      columnNames.add(column.getName()); 
     } 
     SimpleBeanPropertyFilter csvReponseFilter = new SimpleBeanPropertyFilter.FilterExceptFilter(columnNames); 
     FilterProvider filterProvider = new SimpleFilterProvider().addFilter(CSV_FILTER_NAME, csvReponseFilter); 
     CsvMapper csvMapper = new CsvMapper(); 
     csvMapper.setFilters(filterProvider); 
     csvMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() { 
      @Override 
      public Object findFilterId(AnnotatedClass annotatedClass) { 
       return CSV_FILTER_NAME; 
      } 
     }); 
     ObjectWriter objectWriter = csvMapper.writer(csvSchema); 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     objectWriter.writeValue(byteArrayOutputStream, csvSchema); 
     return new String(byteArrayOutputStream.toByteArray(), "UTF-8"); 
    } 

Главный метод:

public static void main(String args[]) { 
     CsvSchema csvSchema = CsvSchema.builder() 
       .addColumn("name") 
       .addColumn("age") 
       .addColumn("height") 
       .addColumn("weight") 
       .setUseHeader(true) 
       .build() 
       .withLineSeparator("\n"); 
     Person person = new Person("Tim", "32", "184", "100"); 
     try { 
      System.out.println(CsvUtilities.marshal(person, csvSchema)); 
     } catch (IOException ex) { 
      Logger.getLogger(CsvUtilities.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

Что вызывает это исключение?

EDIT Вот весь мой импорт:

import com.fasterxml.jackson.dataformat.csv.CsvMapper; 
import com.fasterxml.jackson.dataformat.csv.CsvSchema; 
import java.io.ByteArrayOutputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.HashSet; 
import java.util.List; 
import java.util.logging.Logger; 
import org.apache.commons.io.IOUtils; 
import org.apache.commons.lang3.StringUtils; 
import org.codehaus.jackson.map.ObjectWriter; 
import org.codehaus.jackson.map.introspect.AnnotatedClass; 
import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector; 
import org.codehaus.jackson.map.ser.FilterProvider; 
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter; 
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider; 
+0

ObjectWriter objectWriter = csvMapper.writer (csvSchema); Как api doc, писатель должен вернуть com.fasterxml.jackson.databind.ObjectWriter из пакета данных, а не map.ObjectWriter из вашего импорта. – slee

+0

Если я изменяю импорт на databind, тогда эта строка прерывает 'ObjectWriter objectWriter = csvMapper.writer (csvSchema);' Он говорит 'несовместимые типы: org.codehaus.jackson.map.ObjectWriter не может быть преобразован в com.fasterxml.jackson.databind .ObjectWriter' – Hooli

+0

Я думаю, что версия для Джексона имеет значение. Вы смешали использование fastxml jackson и codehaus jackson вместе, что является старой версией. Попробуйте использовать только fastxml jackson. постскриптум если вы запрограммировали идею IDE, то легко узнать, что произошло. – slee

ответ

-1

Смотрите банки в своем классе пути. Может быть, есть две или разные версии Jackson jar, которая не имеет этого метода. Возможно, более старая версия была заархивирована загрузчиком класса.

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