2

I'm trying to marshal an Object into a csv String. I have created a method that can convert any object into a csv String but I keep getting the exception:

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

Marshal method:

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");
    }

Main method:

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);
        }
    }

What is causing this exception?

EDIT Here's all my imports:

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;
StaxMan
  • 113,358
  • 34
  • 211
  • 239
Hooli
  • 1,135
  • 3
  • 19
  • 46
  • ObjectWriter objectWriter = csvMapper.writer(csvSchema); As the api doc, the writer should return a com.fasterxml.jackson.databind.ObjectWriter from the databind package not a map.ObjectWriter from your import. – slee Apr 01 '16 at 13:52
  • If I change the import to databind then this line breaks `ObjectWriter objectWriter = csvMapper.writer(csvSchema);` It says `incompatible types: org.codehaus.jackson.map.ObjectWriter cannot be converted to com.fasterxml.jackson.databind.ObjectWriter` – Hooli Apr 01 '16 at 14:00
  • I guess jackson version matters. You mixed use of fastxml jackson and codehaus jackson together which is an old version. Try to use fastxml jackson only. p.s. if you programmed in an IDE like idea, it's easy to find out what happened. – slee Apr 01 '16 at 14:47
  • I've removed codehaus but now I'm getting errors on these lines: `for (CsvSchema.Column column : csvSchema) {` and `csvMapper.setFilters(filterProvider);` and `csvMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {` and `ObjectWriter objectWriter = csvMapper.writer(csvSchema);` – Hooli Apr 01 '16 at 15:00
  • Could you update the example so it does not have `org.codehaus` entries (those are for Jackson 1.x and are not of use here), as well as current exception you get? – StaxMan Apr 01 '16 at 17:56

1 Answers1

-1

See the jars in your class path. It could be that there are two or different version of jackson jar which does not have this method. Maybe an older version been laoded in by the Class loader.

Also inspect your dependencies which you have added to the project.

Mohammed
  • 324
  • 3
  • 4