2016-10-23 58 views
0

我想解开一个我打开的XML文件,但它在我打印时返回 “[[email protected]]”。JAXB unmarshal XML文件O​​bservableList

我看着这里,但它不工作Null Pointer Exception in JAXB RI ClassFactory

类问题:

import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 


public class Problem { 
private StringProperty problems; 


public Problem() {   
} 

public Problem(String problems) { 
    this.problems = new SimpleStringProperty(problems); 
} 

public String getproblems() { 
    return problems.get(); 
} 
public void setproblems(String problems) { 
    this.problems.set(problems); 
} 
public StringProperty problemsProperty() { 
    return problems; 
} 
@Override 
public String toString(){return getproblems();} 

}

包装:

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

import javafx.collections.ObservableList; 

@XmlRootElement(name = "probl") 
public class ProblemListWrapper { 

private ObservableList<Problem> problem; 

@XmlJavaTypeAdapter(ListProblemAdapter.class) 
public ObservableList<Problem> getProblems() { 
    return problem; 
} 

public void setProblems(ObservableList<Problem> problems) { 
    this.problem = problems; 
} 

}

ListAdapter:

import javax.xml.bind.annotation.adapters.XmlAdapter; 

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 

public class ListProblemAdapter extends XmlAdapter<ListProblem, ObservableList<Problem>> { 

    @Override 
    public ObservableList<Problem> unmarshal(ListProblem v) throws Exception { 
    ObservableList<Problem> problemData = FXCollections.observableArrayList(v.problem); 
    return problemData; 
    } 

    @Override 
    public ListProblem marshal(ObservableList<Problem> v) throws Exception { 
     ListProblem problems = new ListProblem(); 
    v.stream().forEach((item) -> { 
     problems.problem.add(item); 
    }); 
    return problems; 
    } 
} 

列表:

import java.util.ArrayList; 
import java.util.List; 

import javax.xml.bind.annotation.XmlElement; 

public class ListProblem { 

@XmlElement(name = "problem") 
    List<Problem> problem = new ArrayList<>(); 

    public List<Problem> getproblems() { 
    return problem; 

    } 
} 

而且主营:

public void loadProblemDataFromFile(File file) { 
    try { 
     JAXBContext context = JAXBContext 
       .newInstance(ProblemListWrapper.class); 

     Unmarshaller um = context.createUnmarshaller(); 


     ProblemListWrapper wrap = (ProblemListWrapper)um.unmarshal(file);     

     problemData.clear(); 
     problemData.addAll(wrap.getProblems()); 

     System.out.println(problemData.get(0).toString()); 

     setProblemFilePath(file); 


    } catch (Exception e) { 
     Alert alert = new Alert(AlertType.ERROR); 
     alert.setTitle("Error"); 
     alert.setHeaderText("Could not load data"); 
     alert.setContentText("Could not load data from file:\n" + file.getPath()); 

     alert.showAndWait(); 
    } 
} 
    public void saveProblemDataToFile(File file) { 
    try {   
     JAXBContext context = JAXBContext 
       .newInstance(ProblemListWrapper.class); 
     Marshaller m = context.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 


     System.out.println(problemData.get(0).toString()); 


     ProblemListWrapper wrapper = new ProblemListWrapper(); 
     wrapper.setProblems(problemData); 

     m.marshal(wrapper, file); 


     setProblemFilePath(file); 
    } catch (Exception e) { // catches ANY exception 
     Alert alert = new Alert(AlertType.ERROR); 
     alert.setTitle("Error"); 
     alert.setHeaderText("Could not save data"); 
     alert.setContentText("Could not save data to file:\n" + file.getPath()); 

     alert.showAndWait(); 
    } 
} 
+0

打印时你想得到什么?现在看起来你正在打印对象,这就是为什么你得到你所得到的结果 –

+0

System.out.println(problemData.size());输出:3,但System.out.println(problemData.get(0).toString); Outpbut:[email protected]我需要字符串,但显示哈希码 –

+1

您期待从'System.out.println(...)'语句中看到什么? –

回答

0

问题是默认的构造函数中Problem.class

public Problem() { 
    **this(null);** 

多数民众赞成