J'aimerais que Jackson désérialise une classe avec le constructeur suivant:
public Clinic(String name, Address address)
La désérialisation du premier argument est facile. Le problème est que l'adresse est définie comme:
public class Address {
private Address(Map<LocationType, String> components)
...
public static class Builder {
public Builder setCity(String value);
public Builder setCountry(String value);
public Address create();
}
}
et est construit comme ceci: new Address.Builder().setCity("foo").setCountry("bar").create();
Existe-t-il un moyen d'obtenir des paires clé-valeur de Jackson afin de construire l'adresse moi-même? Sinon, existe-t-il un moyen pour que Jackson utilise la classe Builder elle-même?
@JsonPOJOBuilder
annotation, renommez "create" en "build" et annotez chaque créateur de générateur avec@JsonProperty
.@Jacksonized
ce qui remplace le constructeur interne et les annotations jackson par une seule chose@Jackonized
est une fonctionnalité expérimentale qui vient d'être publiée à Lombok. Je ne pense pas que ce soit une bonne idée d'encourager inutilement l'adoption de fonctionnalités expérimentales. b) la question ne mentionne pas ou n'utilise pas Lombok. Je ne pense pas que ce soit une bonne idée d'introduire inutilement une dépendance pour résoudre un problème.La réponse de @Rupert Madden-Abbott fonctionne. Cependant, si vous avez un constructeur autre que celui par défaut, par exemple,
Ensuite, vous devez annoter les paramètres comme ci-dessous:
@JsonCreator Builder(@JsonProperty("city") String city, @JsonProperty("country") String country) {...}
la source
Une solution qui me convenait dans ce cas (j'ai utilisé l'annotation constructeur "Lombok").
@Getter @Builder(builderMethodName = "builder") @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) @JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.ANY, creatorVisibility = JsonAutoDetect.Visibility.ANY )
J'espère que cela vous sera utile aussi.
la source
@Jacksonized
ce qui remplace le constructeur interne et les annotations jackson par une seule choseJ'ai fini par implémenter cela en utilisant @JsonDeserialize comme suit:
@JsonDeserialize(using = JacksonDeserializer.class) public class Address {...} @JsonCachable static class JacksonDeserializer extends JsonDeserializer<Address> { @Override public Address deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException { JsonToken token = parser.getCurrentToken(); if (token != JsonToken.START_OBJECT) { throw new JsonMappingException("Expected START_OBJECT: " + token, parser.getCurrentLocation()); } token = parser.nextToken(); Builder result = new Builder(); while (token != JsonToken.END_OBJECT) { if (token != JsonToken.FIELD_NAME) { throw new JsonMappingException("Expected FIELD_NAME: " + token, parser.getCurrentLocation()); } LocationType key = LocationType.valueOf(parser.getText()); token = parser.nextToken(); if (token != JsonToken.VALUE_STRING) { throw new JsonMappingException("Expected VALUE_STRING: " + token, parser.getCurrentLocation()); } String value = parser.getText(); // Our Builder allows passing key-value pairs // alongside the normal setter methods. result.put(key, value); token = parser.nextToken(); } return result.create(); } }
la source
Il n'y a pas de support actuellement pour le modèle de générateur, bien qu'il ait été demandé il y a un certain temps (et enfin le problème Jira http://jira.codehaus.org/browse/JACKSON-469 a été déposé) - c'est quelque chose qui peut être ajouté pour la version 1.8 si la demande est suffisante (assurez-vous de voter chez Jira!). C'est une fonctionnalité supplémentaire raisonnable, et seulement retardée par le temps dont disposent les développeurs. Mais je pense que ce serait un excellent ajout.
la source
Cela a fonctionné pour moi: @NoArgsConstructor Le seul inconvénient de ceci, c'est qu'on peut refaire = new ADTO (). Mais, hé, je n'aime pas la police de code de toute façon, me disant comment utiliser le code de quelqu'un :-) Alors, utilisez mon POJO DTOS comme vous l'aimez. Avec ou sans constructeur. Je suggère: faites-le avec un constructeur, mais soyez mon invité ...
@Data @Builder //Dont forget this! Otherwise no Jackson serialisation possible! @NoArgsConstructor @AllArgsConstructor public class ADTO { ..... }
la source