2016-02-10 8 views
0

Я пытаюсь разобрать XML-файл и сохранить некоторую информацию в mongodb. Я получаю файл для разбора и отправки его на @Controller. Вот код метода POST из @Controller:mongoTemplate - null. Не могу понять, почему

@RequestMapping(value = TracksGeopointsRoutes.TRACKS, method = RequestMethod.POST) 
public String tracks(@RequestParam MultipartFile file){ 

    TracksGeopointsDoc tracksGeopointsDoc = new TracksGeopointsDoc(); 
    try { 
     tracksGeopointsDoc.setFile(tracksGeopointsService.convert(file)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    mongoTemplate.save(tracksGeopointsDoc); 

    new MySaxParser(tracksGeopointsDoc.getFile().getAbsolutePath()); // here I give my file to my parser 
    return "com.ub.geopoints_test.index"; 

} 

И мой парсер:

@Component 
public class MySaxParser extends DefaultHandler{ 

@Autowired 
MongoTemplate mongoTemplate; 

private List<DotGeopointsDoc> dotGeopointsDocList; 
String xmlFileName; 
private String tmpValue; 
private DotGeopointsDoc currentDotGeopointsDoc; 
private DotGeopointsDoc dotGeopointsDoc; 
String bookXmlFileName; 

public MySaxParser() { 
} 

public MySaxParser(String bookXmlFileName) { 
    this.xmlFileName = bookXmlFileName; 
    dotGeopointsDocList = new ArrayList<DotGeopointsDoc>(); 
    dotGeopointsDoc = new DotGeopointsDoc(); 
    parseDocument(); 
} 

private void parseDocument() { 
    // parse 
    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    try { 
     SAXParser parser = factory.newSAXParser(); 
     parser.parse(xmlFileName, this); 
    } catch (ParserConfigurationException e) { 
     System.out.println("ParserConfig error"); 
    } catch (SAXException e) { 
     System.out.println("SAXException : xml not well formed"); 
    } catch (IOException e) { 
     System.out.println("IO error"); 
    } 
} 

@Override 
public void startElement(String s, String s1, String elementName, Attributes attributes) throws SAXException { 
    if (elementName.equalsIgnoreCase("trkpt")) { 
     dotGeopointsDoc.setId(new ObjectId()); 
     dotGeopointsDoc.setLat(attributes.getValue("lat")); 
     dotGeopointsDoc.setLon(attributes.getValue("lon")); 
    } 

} 

@Override 
public void endElement(String s, String s1, String element) throws SAXException { 
    if (element.equals("trkpt")) { 
     dotGeopointsDocList.add(dotGeopointsDoc); 
     mongoTemplate.save(dotGeopointsDoc); // here I'm getting NullPointerException. My mongoTemplate is null 
     dotGeopointsDoc = new DotGeopointsDoc(); 
    } 

} 

@Override 
public void characters(char[] ac, int i, int j) throws SAXException { 
    tmpValue = new String(ac, i, j); 
} 

}

На самом деле не понимаю, почему мой mongoTemplate равно нулю. Причина в моем @Controller это не так. Может ли кто-нибудь мне помочь?

ответ

0

Его потому что Весна не знает о вашем MySaxParser. Вы не должны instentiate ею вашей собственной личности, что вы сделали здесь в контроллере:

new MySaxParser(tracksGeopointsDoc.getFile().getAbsolutePath()); 

Это как ваш контроллер должен выглядеть следующим образом:

@Autowired 
private MySaxParser mySaxParser;//this is how you can inject a spring managed object 

@RequestMapping(value = TracksGeopointsRoutes.TRACKS, method = RequestMethod.POST) 
public String tracks(@RequestParam MultipartFile file) { 

    TracksGeopointsDoc tracksGeopointsDoc = new TracksGeopointsDoc(); 
    try { 
     tracksGeopointsDoc.setFile(tracksGeopointsService.convert(file)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    mongoTemplate.save(tracksGeopointsDoc); 

    mySaxParser.setUpMySaxParser(tracksGeopointsDoc.getFile().getAbsolutePath()); 
    return "com.ub.geopoints_test.index"; 

} 

и это, как ваш XML-анализатор должен быть изменен :

@Service//this is more of a service then a component 
public class MySaxParser extends DefaultHandler { 

@Autowired 
private MongoTemplate mongoTemplate; 

private List<DotGeopointsDoc> dotGeopointsDocList; 
private String xmlFileName; 
private String tmpValue; 
private DotGeopointsDoc currentDotGeopointsDoc; 
private DotGeopointsDoc dotGeopointsDoc; 
private String bookXmlFileName; 

//you do not need constuctors here just a "setup method ex." 
public void setUpMySaxParser(String bookXmlFileName) { 
    this.xmlFileName = bookXmlFileName; 
    dotGeopointsDocList = new ArrayList<DotGeopointsDoc>(); 
    dotGeopointsDoc = new DotGeopointsDoc(); 
    parseDocument(); 
} 

private void parseDocument() { 
    // parse 
    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    try { 
     SAXParser parser = factory.newSAXParser(); 
     parser.parse(xmlFileName, this); 
    } catch (ParserConfigurationException e) { 
     System.out.println("ParserConfig error"); 
    } catch (SAXException e) { 
     System.out.println("SAXException : xml not well formed"); 
    } catch (IOException e) { 
     System.out.println("IO error"); 
    } 
} 

@Override 
public void startElement(String s, String s1, String elementName, Attributes attributes) throws SAXException { 
    if (elementName.equalsIgnoreCase("trkpt")) { 
     dotGeopointsDoc.setId(new ObjectId()); 
     dotGeopointsDoc.setLat(attributes.getValue("lat")); 
     dotGeopointsDoc.setLon(attributes.getValue("lon")); 
    } 

} 

@Override 
public void endElement(String s, String s1, String element) throws SAXException { 
    if (element.equals("trkpt")) { 
     dotGeopointsDocList.add(dotGeopointsDoc); 
     mongoTemplate.save(dotGeopointsDoc); // here I'm getting NullPointerException. My mongoTemplate is null 
     dotGeopointsDoc = new DotGeopointsDoc(); 
    } 

} 

@Override 
public void characters(char[] ac, int i, int j) throws SAXException { 
    tmpValue = new String(ac, i, j); 
} 
} 
+0

Да, это сработало! Ты гений! Большое спасибо! – Dexa

+0

Ваш прием :) – Wermerb