2008-12-11 10 views
10

Comment configurer JAXB unmarshaller pour qu'il coupe les espaces de début et de fin des chaînes?Comment configurer JAXB pour qu'il coupe les espaces lors de la modification d'une valeur de variable?

Par exemple considérons une liaison simple entre un bean Java et XML utilisant des annotations JAXB:

@XmlRootElement(name="bean") 
class Bean { 

    @XmlElement(required=true) 
    String name; 

    @XmlElement(required=true) 
    int number; 
} 

Je voudrais être en mesure de XML unmarshal donné ci-dessous afin bean.name ne comprend pas le démarrage et espaces de fin - est "Mon nom", pas "\ nnom \ n".

+0

analyseur XML malheureusement traite que des espaces « important » si vous pouvez formater votre sortie sans linebreaks serait plus facile que tous les autres cerceaux. .. –

Répondre

6

Utilisez une classe personnalisée adaptateur. Je pensais que NormalizedStringAdapter ferait le travail mais c'est seulement pour unmarshaling et il ne fait pas ce que vous voulez de toute façon.

public class MyNormalizedStringAdapter extends XmlAdapter<String, String> { 

    @Override 
    public String marshal(String text) { 
     return text.trim(); 
    } 

    @Override 
    public String unmarshal(String v) throws Exception { 
     return v.trim(); 
    } 
} 

puis décorer le champ avec votre adaptateur comme celui-ci:

@XmlElement(required=true) 
@XmlJavaTypeAdapter(MyNormalizedStringAdapter.class) 
String name; 
+0

Existe-t-il un autre moyen de réaliser cela sans créer un XmlAdapter personnalisé? – tkokoszka

+3

Peut-il être que le NormalizedStringAdapter est totalement brisé? Il est dit qu'il supprime les espaces de début et de fin (voir javadoc), mais en fait ce n'est pas le cas! – Kutzi

+0

@Kutzi Oui, la documentation ou l'implémentation est incorrecte. Tout ce qu'il fait est de remplacer les caractères tabulation, lf et cr avec un espace. – Kapep