2010-09-14 11 views
0

J'essaie de données unmarshall à partir d'un objet XML en Java en utilisant SimpleXML. Le but de l'ensemble était de convertir une API de JAXB en SimpleXML. Par conséquent, j'ai utilisé la méthode d'annotation de l'analyse du document. Voici le code:Unmarshalling des données XML directement dans l'objet

Dans la classe User:

@Element(name="created", required=false) 
private Date created; 

Le programmeur qui a écrit l'API utilisé un DateAdapter pour transformer la chaîne tirée depuis l'XML directement dans une date. J'ai essayé de le convertir en SimpleXML. Mon hypothèse est qu'un transformateur a utilisé la même approche. Voici ce code avant et après ...

Avant:

public class DateAdapter extends XmlAdapter<String, Date> { 

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

    public Date unmarshal(String date) throws Exception { 
    return df.parse(date); 
    } 

    public String marshal(Date date) throws Exception { 
    return df.format(date); 
    } 
} 

Après:

public class DateAdapter implements Transform<Date> { 
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

    @Override 
    public Date read(String date) throws Exception { 
    return df.parse(date); 
    } 

    @Override 
    public String write(Date date) throws Exception { 
    return df.format(date); 
    } 
} 

Je suppose que je l'ai fait la conversion mal parce que je reçois maintenant des erreurs de date inanalysables. La partie bizarre est que, même si je mets des blocs if-else ou try-catch dans les méthodes de lecture et d'écriture, je reçois toujours l'erreur. Donc je pense que la question principale est, comment puis-je écrire correctement un adaptateur comme celui de JAXB pour marshall/unmarshall entre la chaîne du XML et un objet Date.

+0

Quelle est exactement l'erreur que vous obtenez, et où? Vous pourriez vouloir coller une trace de pile. – Ladlestein

Répondre

0

J'ai résolu le problème. Cela n'avait rien à voir avec l'API sur laquelle je travaillais, mais plutôt la conversion d'un double en une date qui n'était pas vérifiée par le framework XML. Le double stocké dans le XML était en temps Epoch en secondes, avec des décimales pour les millisecondes. SimpleXML n'a pas pu gérer correctement les décimales. Ma solution de contournement consistait simplement à demander un double au lieu d'avoir les données non rassemblées dans une date. Donc, je me suis débarrassé de l'adaptateur entier et juste changé

@Element(name="created", required=false) 
private Date created; 

à

@Element(name="created", required=false) 
private double created; 

Je suis sûr qu'il ya un moyen simple de convertir cela en une date après le fait, mais je figure il est préférable de le laisser tel quel.