简体   繁体   English

Springboot - 将实体保存在“普通”类中

[英]Springboot - Save entity in 'normal' class

I'm pretty new to Springboot and Java in general and because we got this in school I'm fiddeling arround.一般来说,我对 Springboot 和 Java 还是很陌生,因为我们在学校得到了这个,所以我在摆弄。

I'm now trying to save an entity outside of the Springboot Entities, Repositories or RestController with the following code:我现在正在尝试使用以下代码在 Springboot Entities、Repositories 或 RestController 之外保存一个实体:

InfMApplication.java: InfMApplication.java:

package com.domain.springboot;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.domain.springboot.repositories.MovieRepository;
import com.domain.springboot.services.MovieImport;

@SpringBootApplication
public class InfMApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(InfMApplication.class, args);
        MovieImport movieImport = new MovieImport();
        movieImport.saveToDb();
    }
    
}

MovieImport.java:电影导入.java:

package com.domain.springboot.services;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.CrossOrigin;

import java.io.*;
import java.net.URL;

import com.google.gson.Gson;

import com.domain.omdbapi.entities.Movie;
import com.domain.omdbapi.entities.SearchResponse;
import com.domain.omdbapi.entities.SearchResult;
import com.domain.springboot.repositories.ComplexRepository;
import com.domain.springboot.repositories.DocumentRepository;
import com.domain.springboot.repositories.MovieRepository;
import com.domain.springboot.repositories.SimpleRepository;

@Service
public class MovieImport {
    
    private final MovieRepository movieRepository;
    
    public MovieImport(MovieRepository movieRepository){
          this.movieRepository =  movieRepository;
        }
    
    public void main() {
        String randomImdbId = fetchRandomMovie();
        Movie movie = fetchMovieDetails(randomImdbId);
        saveToDb(movie);
    }
    
    public void saveToDb(Movie movie) {
        com.domain.springboot.entities.Movie springbootMovie = new com.domain.springboot.entities.Movie(movie.Title, movie.imdbID);
        this.movieRepository.save(springbootMovie);
        
        
    }
    
    public String fetchRandomMovie() {
        String randomWord = getRandomWord();
        String url = "https://www.omdbapi.com/?apikey=<API_KEY>&type=movie&s=" + randomWord;
        HttpClient client = HttpClient.newHttpClient();
        
        HttpRequest request = HttpRequest.newBuilder(
                URI.create(url))
            .header("accept", "application/json")
            .build();
        
        HttpResponse<String> response = null;

        try {
            response = client.send(request, BodyHandlers.ofString());
        } catch (Exception e) {
            System.out.println(e);
        }
        
        Gson gson = new Gson();
        SearchResponse searchResponse = gson.fromJson(response.body(), SearchResponse.class);
        
        int randomIndex = new Random().nextInt(0, searchResponse.getSearch().length);
        SearchResult randomResult = searchResponse.getSearch()[randomIndex];
        
        return randomResult.getImdbID();
    }
    
    
    public Movie fetchMovieDetails(String imdbId) {
        String url = "https://www.omdbapi.com/?apikey=<API_KEY>&type=movie&plot=full&i=" + imdbId;
        HttpClient client = HttpClient.newHttpClient();
        
        HttpRequest request = HttpRequest.newBuilder(
                URI.create(url))
            .header("accept", "application/json")
            .build();
        
        HttpResponse<String> response = null;

        try {
            response = client.send(request, BodyHandlers.ofString());
        } catch (Exception e) {
            System.out.println(e);
        }
        
        Gson gson = new Gson();
        Movie movie = gson.fromJson(response.body(), Movie.class);
        
        return movie;
    }
    
    public String getRandomWord() {
        URL resource = getClass().getClassLoader().getResource("Wordlist.txt");
        
        List<String> words = new ArrayList<>();
        
        try {
            File file = new File(resource.toURI());
            words =  Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        int randomIndex = new Random().nextInt(0, words.size());
        
        return words.get(randomIndex);
    }

}

If I use "this.movieRepository.save(movieObject);"如果我使用“this.movi​​eRepository.save(movieObject);” to save a movie in the MovieRestController the same way, it works.以同样的方式将电影保存在 MovieRestController 中,它可以工作。 I also tried adding the "@Autowire" annotation, but this didn't work.我也尝试添加“@Autowire”注释,但这不起作用。

I always get the error我总是得到错误

java.lang.NullPointerException: Cannot invoke "com.domain.springboot.repositories.MovieRepository.save(Object)" because "this.movieRepository" is null

How can I get to use the movieRepository in other Java classes like in the RestControllers?如何在其他 Java 类(如 RestControllers)中使用 movieRepository?

java.lang.NullPointerException: Cannot invoke "com.domain.springboot.repositories.MovieRepository.save(Object)" because "this.movieRepository" is null java.lang.NullPointerException:无法调用“com.domain.springboot.repositories.MovieRepository.save(Object)”,因为“this.movi​​eRepository”为空

Above is perfectly valid if we look at your following shared code.如果我们查看您的以下共享代码,上述内容是完全有效的。

public class MovieImport {
    
    private MovieRepository movieRepository;
    
    public void saveToDb() {
        // Create movie
        com.domain.springboot.entities.Movie springbootMovie = new com.domain.springboot.entities.Movie("Iron Man", "284cb8fgf");
        this.movieRepository.save(springbootMovie);
    }
}

You've to correct certain things in your code base.您必须更正代码库中的某些内容。 First you're not initializing the movieRepository and therefore, you're getting the null pointer exception.首先你没有初始化movieRepository ,因此你得到了空指针异常。 As you've been using the springboot you can use construction injection to initialized the field by spring container.由于您一直在使用 springboot,您可以使用构造注入来通过 spring 容器初始化字段。 Also.还。 this class should be scanned by spring and you should also put some annotation such as Component or Service on top of it.这个类应该被spring扫描,你还应该在它上面放一些注解,比如Component或者Service。

Following will work if your MovieImport and MovieRepository classess will scan by springboot.如果您的 MovieImport 和 MovieRepository 类将由 springboot 扫描,则以下将起作用。

package com.domain;
import com.domain.omdbapi.entities.Movie;
import com.domain.springboot.repositories.MovieRepository;

@Service
public class MovieImport {
    
    private final MovieRepository movieRepository;

    public MovieImport(MovieRepository movieRepository){
      this.movieRepository =  movieRepository;
    }
    
    public void saveToDb() {
        // Create movie
        com.domain.springboot.entities.Movie springbootMovie = new com.domain.springboot.entities.Movie("Iron Man", "284cb8fgf");
        this.movieRepository.save(springbootMovie);
    }
}

Updated更新

@SpringBootApplication  
public class InfMApplication implements CommandLineRunner {

    @Autowired
    private MovieImport movieImport;

    public static void main(String[] args) {
        SpringApplication.run(InfMApplication.class, args);
    }
    
    @Override
    public void run(String... args) throws Exception {
      movieImport.saveToDb();
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM