2016-08-16 4 views
0

J'ai une application Web Java qui utilise Jackson 2.x pour désérialiser les requêtes JSON. J'interface actuellement avec une application externe qui envoie des données JSON avec des dates mal formatées dans une propriété de l'une des classes. Cela provoque des exceptions avec les appels de ce client (aussi bien qu'il devrait). Cependant, pour des raisons commerciales, nous avons besoin d'une solution de contournement temporaire pour accepter ces demandes. Jusqu'à ce que ce client répare les données qu'il envoie à mon application (ce qui peut prendre un certain temps), je veux traiter toutes les mauvaises dates dans cette propriété comme nulles. Je ne souhaite pas modifier la classe elle-même, car il s'agit d'une API publique exposée à d'autres clients, et je ne souhaite pas que cette solution de contournement temporaire soit incluse dans cette classe.Désérialisation de dates mal formatées comme nulles dans Jackson

Existe-t-il un moyen facile de configurer Jackson pour traiter les dates non valides comme nulles? Je vois des fonctionnalités similaires dans DeserializationFeature, mais rien spécifiquement pour cela.

Répondre

1

Une solution qui vous avez besoin primordial le poseur de la classe d'origine dans une sous-classe:

public class InvalidDateDeserializer extends JsonDeserializer<Date> 
{ 
    @Override 
    public Date deserialize(JsonParser jsonParser, 
      DeserializationContext deserializationcontext) throws IOException, JsonProcessingException { 
     SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy'T'HH:mm:ss"); 
     String date = jsonParser.getText(); 
     try { 
      return sdf.parse(date); 
     } catch (ParseException e) { 
      return null; 
     } 
    } 
} 

, vous juste besoin ensuite pour annoter le poseur surchargée dans votre classe avec

@JsonDeserialize(using = InvalidDateDeserializer.class) 

Ainsi, la nouvelle classe DTO ressemblerait à ceci:

public MyModel extends TheirModel { 
    @Override 
    @JsonDeserialize(using = InvalidDateDeserializer.class) 
    public void setProblematicDate() { 
     super.setProblematicDate(); 
    } 
} 

Je comprends thi s n'est pas une solution de drapeau magique, mais cela devrait fonctionner dans votre cas sans changer la classe DTO d'origine.