Lors de l'analyse CSV avec un séparateur de colonne personnalisé ';' et en utilisant:
@JsonPropertyOrder({ "Email", "FirstName", "LastName" })
public class Author {
String Email;
String FirstName;
String LastName;
public String getEmail() {
return Email;
}
public void setEmail(String Email) {
this.Email = Email;
}
public String getFirstName() {
return FirstName;
}
public void setFirstName(String firstName) {
FirstName = firstName;
}
public String getLastName() {
return LastName;
}
public void setLastName(String lastName) {
LastName = lastName;
}
public Author(String email, String firstName, String lastName) {
Email = email;
FirstName = firstName;
LastName = lastName;
}
}
J'obtiens l'erreur suivante:
public static <T> List<T> loadObjectList(Class<T> type, String fileName) {
CsvSchema bootstrapSchema = CsvSchema.emptySchema();
bootstrapSchema.withColumnSeparator(';').withoutQuoteChar();
CsvMapper mapper = new CsvMapper();
File file = new File(fileName);
MappingIterator<T> readValues =
mapper.reader(type)
.with(bootstrapSchema)
.readValues(new InputStreamReader(new FileInputStream(file), "ISO-8859-1"));
return readValues.readAll();
}
voici mon code d'analyse:
com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class Author] from String value ('Email;FirstName;LastName'); no single-String constructor/factory method
3 Réponses :
CsvSchema bootstrapSchema = CsvSchema.emptySchema().bootstrapSchema.withColumnSeparator(';').withoutQuoteChar();
Comme c'est souvent le cas, la solution à votre problème est la suivante: faites attention au message d'exception.
Voici le message d'exception que vous avez inclus:
com.fasterxml.jackson.databind.JsonMappingException: Impossible d'instancier la valeur de type [type simple, classe Auteur] à partir de la valeur String ('Email; FirstName; LastName'); pas de méthode constructeur / usine à chaîne unique
Voici une solution en 3 étapes à votre question:
Étape 1: Notez ceci dans le message d'exception: pas de méthode constructeur / usine à chaîne unique
Étape 2: Jetez un œil à la classe Author que vous avez incluse.
Notez qu'il n'inclut ni un constructeur ni une méthode de fabrique qui accepte
exactement une chaîne comme paramètre.
Étape 3: Ajouter un constructeur à la classe Author qui accepte une seule chaîne comme paramètre.
Voici quelques code (ce n'est pas le code final, vous devrez ajouter la gestion des erreurs):
public Author(final String line)
{
final String[] lineContentArray = line.split(";");
// Note: consider using the standard java field naming convention.
email = line[0];
firstName = line[1];
lastName = line[2];
}
La réponse acceptée permet en effet de résoudre le problème OP selon la suggestion du message d'exception.
Cependant, tout l'intérêt de l'utilisation de CSVMapper est de ne pas écrire de code pour la séparation autour du séparateur et de l'affectation aux champs. C'est ce que la bibliothèque est censée faire.
Comme j'ai rencontré le même problème, j'ai creusé un peu et j'ai trouvé ce qui suit. Il s'agit d'utiliser typedSchemaFor où type est la classe cible.
En effet un peu dérangeant de devoir passer le type à la fois pour le mappeur et le schéma.
ObjectReader objectReader() {
CsvMapper mapper = new CsvMapper();
CsvSchema schema = schema(mapper);
return mapper.readerFor(type).with(schema);
}
CsvSchema schema(CsvMapper mapper) {
return mapper.typedSchemaFor(type)
.withColumnSeparator(';')
.withoutHeader()
.withoutQuoteChar();
}
Vous devez définir le constructeur avec une seule valeur
String.