2017-06-08 5 views
3

Est-il possible d'utiliser Jersey avec Moxy de/vers Json et Java 8 Optionals?Comment utiliser Java 8 Facultatif avec Moxy et Jersey

Comment le configurer?

+0

vous AFAIK besoin d'un adaptateur personnalisé pour gérer cela. –

+0

Aucun pot d'insertion en tant que dépendance maven? Je suis sûr que je ne suis pas le premier à avoir ce problème. – kalamar

+0

Je voudrais également demander comment écrire un XmlAdapter pour un optionnel qui est générique .... au cas où cela fait partie de la solution. – kalamar

Répondre

0

Vous pouvez déclarer la classe suivante:

public class OptionalAdapter<T> extends XmlAdapter<T, Optional<T>> { 

    @Override 
    public Optional<T> unmarshal(T value) throws Exception { 
     return Optional.ofNullable(value); 
    } 

    @Override 
    public T marshal(Optional<T> value) throws Exception { 
     return value.orElse(null); 
    } 

} 

Et utiliser comme ceci:

@XmlRootElement 
public class SampleRequest { 

    @XmlElement(type = Integer.class) 
    @XmlJavaTypeAdapter(value = OptionalAdapter.class) 
    private Optional<Integer> id; 

    @XmlElement(type = String.class) 
    @XmlJavaTypeAdapter(value = OptionalAdapter.class) 
    private Optional<String> text; 

    /* ... */ 

} 

Ou déclarer package-info.java et retirer @XmlJavaTypeAdapter de POJO:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlJavaTypeAdapters({ 
     @XmlJavaTypeAdapter(type = Optional.class, value = OptionalAdapter.class) 
}) 

Mais voici quelques-uns inconvénients:

  1. L'adaptateur ci-dessus ne peut fonctionner qu'avec des types simples comme Integer, String, etc. qui peuvent être analysés par MOXY par défaut.
  2. Vous devez spécifier explicitement @XmlElement(type = Integer.class) pour indiquer le type de l'analyseur, sinon les valeurs null seront transmises à la méthode unmarshal de l'adaptateur.
  3. Vous manquez l'opportunité d'utiliser des adaptateurs pour les types personnalisés, par ex. adaptateur personnalisé pour la classe java.util.Date en fonction d'une chaîne de format de date. Pour surmonter cela, vous devrez créer quelque chose comme adaptateur class OptionalDateAdapter<String> extends XmlAdapter<String, Optional<Date>>.

utilisant également Optional sur le terrain n'est pas recommandé, voir this discussion pour plus de détails.

Compte tenu de tout ce qui précède, je suggère que l'utilisation Optional comme type de retour pour vos POJO:

@XmlRootElement 
public class SampleRequest { 

    @XmlElement 
    private Integer id; 

    public Optional<Integer> getId() { 
     return Optional.ofNullable(id); 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

}