Когда запускается служба весенней загрузки, вставьте данные в mongodb - PullRequest
0 голосов
/ 18 марта 2020

В настоящее время я новичок в среде Spring Boot Java и создаю простое приложение. Когда моя служба запускается, я хочу иметь возможность читать необработанный файл с URL, анализировать эти данные и загружать их в мою базу данных mongodb атласа. Пока это то, что у меня есть:

@Service
public class CoronaVirusDataService {
  private List<LocationStats> allConfirmedStats = new ArrayList<>();
  MongoOperations mongoOperations;

  @PostConstruct // run this method as soon as the application runs
  @Scheduled(cron = "* * 1 * * *") // execute this method every day
  public void fetchVirusData() {
    List<LocationStats> newStats = new ArrayList<>(); // to hold the stats of each state
    HttpClient client = HttpClient.newHttpClient();
    // creating a new http request
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(ConstantsUtil.VIRUS_CONFIRMED_DATA_URL))
        .build();

    // get a response by having the client send the request
    try {
      HttpResponse<String> httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString());
      // parse the body of the request from csv format to readable format
      StringReader csvBodyReader = new StringReader(httpResponse.body());
      Iterable<CSVRecord> records = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(csvBodyReader);
      for (CSVRecord record: records) {
        // create a model with the parsed data
        LocationStats stats = new LocationStats();
        stats.setState(record.get("Province/State"));
        stats.setCountry(record.get("Country/Region"));
        // the latest day
        int latestCases = Integer.parseInt(record.get(record.size() - 1));
        int prevDayCases = Integer.parseInt(record.get(record.size() - 2));
        stats.setLatestTotalCases(latestCases);
        stats.setDiffFromPreviousDay(prevDayCases);

        mongoOperations.save(LocationStats);

        // add to new stats
        newStats.add(stats);
      }
      // assign to class array -> we use this array to display the data
      this.allConfirmedStats = newStats;

    } catch (IOException | InterruptedException e) {
      e.printStackTrace();
    }
  }

}

Итак, основная проблема в том, что данные не сохраняются в mongoDB после того, как я вызову mongoOperations.save (). Кроме того, я узнал, что поддержание некоторого типа состояния в Сервисе - плохая практика. Какова лучшая практика для этого? Об этом позаботится вставка данных в MongoDB, поскольку мы не управляем государством.

Вот мой класс модели, который я хочу сохранить в mongodb

@Document(collection = "LocationStats")
public class LocationStats {
  /** Location model to show corona virus statistics in each state*/
  @Id
  private String state;
  private String country;
  private int latestTotalCases;
  private int diffFromPreviousDay;

  public String getState() {
    return state;
  }

  public void setState(String state) {
    this.state = state;
  }

  public String getCountry() {
    return country;
  }

  public void setCountry(String country) {
    this.country = country;
  }

  public int getLatestTotalCases() {
    return latestTotalCases;
  }

  public void setLatestTotalCases(int latestTotalCases) {
    this.latestTotalCases = latestTotalCases;
  }

  public int getDiffFromPreviousDay() {
    return diffFromPreviousDay;
  }

  public void setDiffFromPreviousDay(int diffFromPreviousDay) {
    this.diffFromPreviousDay = diffFromPreviousDay;
  }

  @Override
  public String toString() {
    return "LocationStats{" +
        "state='" + state + '\'' +
        ", country='" + country + '\'' +
        ", latestTotalCases=" + latestTotalCases +
        '}';
  }
}

, как только мои модели будут сохранены в mongoDB, я хочу прочитать из базы данных и получить все данные из каждого собирать и отображать его на веб-странице. Я думаю, что я получу эти данные в классе контроллера и передам их внешнему интерфейсу, это хорошая практика? вот мой класс контроллера.

@Controller
public class HomeController {
  /** Controller class to generate/render the html UI */
  @Autowired
  CoronaVirusDataService coronaVirusDataService;

  @Autowired
  MongoOperations mongoOperations;

  @GetMapping("/") // map this to the root template
  public String home(Model model) {
    List<LocationStats> allStats = coronaVirusDataService.getAllConfirmedStats();

    // instead of above getter method, have a method call that fetches all data from mongoDB and return it as a List<LocationStats>

    // get the total confirmed cases
    int totalConfirmedCases = allStats.stream().mapToInt(LocationStats::getLatestTotalCases).sum();
    int totalNewCases = allStats.stream().mapToInt(LocationStats::getDiffFromPreviousDay).sum();


    // send the models to the view
    model.addAttribute("locationStats", allStats);
    model.addAttribute("totalReportedCases", totalConfirmedCases);
    model.addAttribute("totalNewCases", totalNewCases);

    return "home";
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...